Вопрос или проблема
У меня есть проект на 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.
Шаги для решения проблемы:
-
Проверьте структуру проекта и путь к заголовочным файлам:
Убедитесь, что путь к заголовочным файлам OpenSSL правильно указан в вашемc_cpp_properties.json
. В вашем случае, вы указали:"${workspaceFolder}/build/_deps/openssl-install/include/"
Проверьте, что заголовочный файл
e_os.h
находится именно в этой директории. Возможно, он существует в другой папке, поэтому стоит провести поиск в каталогеopenssl-install
. -
Проверьте заголовочные файлы OpenSSL:
В OpenSSL 3.0 и выше пути к заголовочным файлам могли измениться. Убедитесь, что вы используете правильный путь к заголовкам. При необходимости откройте папкуinclude
в вашей директории установки OpenSSL и проверьте, нет ли там других подкаталогов, содержащихe_os.h
. -
Редактируйте настройки 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 }
-
Переустановка или обновление OpenSSL:
Если ошибка продолжает появляться, может быть полезно переустановить или обновить OpenSSL, чтобы убедиться, что у вас последняя версия с установленными всеми необходимыми заголовочными файлами. Проверьте, нет ли ошибок в процессе компиляции OpenSSL и убедитесь, что библиотека была собрана правильно. - Проверка переменных среды:
Убедитесь, что переменные среды, такие какPATH
, правильно настроены на использование библиотеки OpenSSL. Возможно, вам нужно добавить пути к библиотекам и включить их.
Заключение:
Проблема, с которой вы столкнулись, заключается в неправильной конфигурации Intellisense или в отсутствии необходимых заголовочных файлов. Следуя указанным шагам и проверяя пути к файлам, вы сможете устранить эту ошибку и восстановить функциональность Intellisense в вашем проекте. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь задавать их.