Необычная ошибка: невозможно открыть исходный файл “internal/e_os.h” (зависимость от “string”)

Вопрос или проблема

У меня есть проект на C++, над которым я работаю, и я включаю исходный код OpenSSL из CMake. Всё работает нормально, и я могу компилировать и связывать его без проблем.

Но теперь у меня возникла проблема в VSCode, где большинство функций Intellisense не работают из-за ошибки cannot open source file "internal/e_os.h" (dependency of "string").

Проблема заключается в том, что я не понимаю, почему он ищет internal/e_os.h, а не openssl/e_os.h, поскольку последний существует, а первый – нет. Я искал по всей системе (MacOS), и существует множество файлов e_os.h, но все они находятся в директории OpenSSL, а не во внутренней директории.

Мой файл .c_cpp_properties.json простой, и он работает для всех остальных зависимостей CMake:

{
    "configurations": [
        {
            "name": "engine",
            "includePath": [
                "${workspaceFolder}/include/**",
                "${workspaceFolder}/build/_deps/**",
                "${workspaceFolder}/build/_deps/openssl-install/include/"
            ],
            "cppStandard": "c++20"
        }
    ],
    "version": 4
}

Не знаю, имеет ли это значение, но вот часть CMake для OpenSSL:

#
# OpenSSL
#

set(OPENSSL_SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/openssl-src)
set(OPENSSL_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/openssl-install)
set(OPENSSL_INCLUDE_DIR ${OPENSSL_INSTALL_DIR}/include)
set(OPENSSL_CONFIGURE_COMMAND ${OPENSSL_SOURCE_DIR}/config)
set(OPENSSL_LIB_SSL ${OPENSSL_INSTALL_DIR}/lib/libssl.a)
set(OPENSSL_LIB_CRYPTO ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a)

if(NOT EXISTS ${OPENSSL_LIB_SSL} OR NOT EXISTS ${OPENSSL_LIB_CRYPTO})
  message("-- OpenSSL Not Found")
  file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/_deps)
  ExternalProject_Add(
    OpenSSL
    SOURCE_DIR ${OPENSSL_SOURCE_DIR}
    GIT_REPOSITORY https://github.com/openssl/openssl.git
    GIT_TAG openssl-3.3.2
    USES_TERMINAL_DOWNLOAD TRUE
    CONFIGURE_COMMAND
      ${OPENSSL_CONFIGURE_COMMAND}
      --prefix=${OPENSSL_INSTALL_DIR}
      --openssldir=${OPENSSL_INSTALL_DIR}
    BUILD_COMMAND make
    TEST_COMMAND ""
    INSTALL_COMMAND make install
    INSTALL_DIR ${OPENSSL_INSTALL_DIR}
  )
  set(OPENSSL_LIBRARIES ${OPENSSL_LIB_SSL} ${OPENSSL_LIB_CRYPTO})
  file(MAKE_DIRECTORY ${OPENSSL_INCLUDE_DIR})
else()
  message("-- OpenSSL Found")
endif()

add_library(OpenSSL::SSL STATIC IMPORTED GLOBAL)
set_property(TARGET OpenSSL::SSL PROPERTY IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libssl.a)
set_property(TARGET OpenSSL::SSL PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR})
add_dependencies(OpenSSL::SSL OpenSSL)
add_library(OpenSSL::Crypto STATIC IMPORTED GLOBAL)
set_property(TARGET OpenSSL::Crypto PROPERTY IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a)
set_property(TARGET OpenSSL::Crypto PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR})
add_dependencies(OpenSSL::Crypto OpenSSL)

Как мне вернуть работу Intellisense?

Ответ или решение

Для решения проблемы с ошибкой "cannot open source file ‘internal/e_os.h’ (dependency of ‘string’)" в Visual Studio Code, которая возникает при использовании библиотеки OpenSSL, вам нужно обратить внимание на несколько аспектов настройки вашего проекта и конфигурации Intellisense.

Шаги для решения проблемы:

  1. Проверьте структуру проекта и путь к заголовочным файлам:
    Убедитесь, что путь к заголовочным файлам OpenSSL правильно указан в вашем c_cpp_properties.json. В вашем случае, вы указали:

    "${workspaceFolder}/build/_deps/openssl-install/include/"

    Проверьте, что заголовочный файл e_os.h находится именно в этой директории. Возможно, он существует в другой папке, поэтому стоит провести поиск в каталоге openssl-install.

  2. Проверьте заголовочные файлы OpenSSL:
    В OpenSSL 3.0 и выше пути к заголовочным файлам могли измениться. Убедитесь, что вы используете правильный путь к заголовкам. При необходимости откройте папку include в вашей директории установки OpenSSL и проверьте, нет ли там других подкаталогов, содержащих e_os.h.

  3. Редактируйте настройки Intellisense:
    Если проблемный файл не может быть найден, возможно, вам нужно добавить дополнительные пути в includePath. Вы можете попробовать добавить:

    "${workspaceFolder}/build/_deps/openssl-src/include/"

    В результате ваше c_cpp_properties.json будет выглядеть примерно так:

    {
       "configurations": [
           {
               "name": "engine",
               "includePath": [
                   "${workspaceFolder}/include/**",
                   "${workspaceFolder}/build/_deps/**",
                   "${workspaceFolder}/build/_deps/openssl-install/include/",
                   "${workspaceFolder}/build/_deps/openssl-src/include/"
               ],
               "cppStandard": "c++20",
           }
       ],
       "version": 4
    }
  4. Переустановка или обновление OpenSSL:
    Если ошибка продолжает появляться, может быть полезно переустановить или обновить OpenSSL, чтобы убедиться, что у вас последняя версия с установленными всеми необходимыми заголовочными файлами. Проверьте, нет ли ошибок в процессе компиляции OpenSSL и убедитесь, что библиотека была собрана правильно.

  5. Проверка переменных среды:
    Убедитесь, что переменные среды, такие как PATH, правильно настроены на использование библиотеки OpenSSL. Возможно, вам нужно добавить пути к библиотекам и включить их.

Заключение:

Проблема, с которой вы столкнулись, заключается в неправильной конфигурации Intellisense или в отсутствии необходимых заголовочных файлов. Следуя указанным шагам и проверяя пути к файлам, вы сможете устранить эту ошибку и восстановить функциональность Intellisense в вашем проекте. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...