- Вопрос или проблема
- Ответ или решение
- Решение проблемы связывания с OpenSSL в CMake
- 1. Проверьте правильность подключения OpenSSL
- 2. Убедитесь в наличии всех необходимых функций
- 3. Проверьте версию библиотеки
- 4. Настройка порядка связывания
- 5. Проверка CMake Выводов
- 6. Убедитесь в наличии правильных заголовков и библиотек
- Заключение
Вопрос или проблема
Я пытаюсь создать проект, который связывается с openssl с использованием CMake. На этапе связи возникают ошибки. Одна из общих библиотек не может найти определенные функции openssl, хотя эта общая библиотека построена успешно.
Часть вывода ошибок, подчеркивающая ошибки:
[ 61%] Построение объекта C CMakeFiles/uSockets.dir/_deps/usockets_content-src/src/quic.c.o
[ 66%] Построение объекта C CMakeFiles/uSockets.dir/_deps/usockets_content-src/src/socket.c.o
[ 72%] Построение объекта C CMakeFiles/uSockets.dir/_deps/usockets_content-src/src/udp.c.o
[ 77%] Связывание C общей библиотеки libuSockets.so
[ 77%] Построена цель uSockets
[ 83%] Построение объекта CXX CMakeFiles/client.dir/client_ws.cc.o
[ 88%] Связывание CXX исполняемого файла client
[ 88%] Построена цель client
[ 94%] Построение объекта CXX CMakeFiles/server.dir/server_ws.cc.o
[100%] Связывание CXX исполняемого файла server
/usr/bin/ld: libuSockets.so: неопределенная ссылка на `us_internal_ssl_socket_context_on_long_timeout'
/usr/bin/ld: libuSockets.so: неопределенная ссылка на `us_internal_ssl_socket_get_native_handle'
/usr/bin/ld: libuSockets.so: неопределенная ссылка на `us_internal_create_child_ssl_socket_context'
/usr/bin/ld: libuSockets.so: неопределенная ссылка на `us_internal_ssl_socket_get_sni_userdata'
/usr/bin/ld: libuSockets.so: неопределенная ссылка на `us_internal_ssl_socket_context_connect_unix'
Полный cmakelists.txt доступен по адресу https://pastebin.com/TVrYhMVc
Полный вывод cmake доступен по адресу https://pastebin.com/1Bvd8GzQ
Есть идеи, чего мне не хватает?
Ответ или решение
Решение проблемы связывания с OpenSSL в CMake
Проблема, с которой вы столкнулись, связана с ошибками при связывании, указывающими на отсутствие ссылок на определенные функции OpenSSL в библиотеке libuSockets.so
. Давайте подробно рассмотрим потенциальные причины этой ошибки и предложим возможные решения.
1. Проверьте правильность подключения OpenSSL
Первым шагом будет убедиться, что OpenSSL правильно подключен к вашему проекту. Убедитесь, что вы используете правильные команды для поиска и подключения библиотек OpenSSL в вашем CMakeLists.txt
. Пример базовой настройки может выглядеть так:
find_package(OpenSSL REQUIRED)
target_link_libraries(${TARGET_NAME} OpenSSL::Crypto OpenSSL::SSL)
Замените ${TARGET_NAME}
на имя вашего целевого приложения или библиотеки.
2. Убедитесь в наличии всех необходимых функций
Ошибки undefined reference
могут указывать на то, что в вашем коде или вашем проекте отсутствуют функции, определенные в OpenSSL. Вам нужно удостовериться, что версии OpenSSL, которые вы используете, содержат эти функции. Вы можете перепроверить документацию OpenSSL, чтобы убедиться, что указанные функции доступны.
3. Проверьте версию библиотеки
Убедитесь, что используется правильная версия OpenSSL. Некоторые функции могут быть удалены или изменены в более поздних версиях. Выполните команду в терминале, чтобы проверить установленную версию OpenSSL:
openssl version
Если у вас установлена неподдерживаемая версия, рассмотрите возможность обновления или применения другой версии, которая совместима с вашим проектом.
4. Настройка порядка связывания
Обратите внимание на порядок, в котором библиотеки передаются в target_link_libraries
. В CMake порядок имеет значение. Убедитесь, что библиотеки OpenSSL связываются после libuSockets
. Пример:
target_link_libraries(uSockets OpenSSL::Crypto OpenSSL::SSL)
5. Проверка CMake Выводов
Изучите вывод CMake на предмет ошибок или предупреждений, которые могут указывать на проблемы с обнаружением OpenSSL. Вы можете включить более подробный вывод, запустив CMake с флагом --debug-find
:
cmake --debug-find ..
6. Убедитесь в наличии правильных заголовков и библиотек
Убедитесь, что заголовочные файлы и библиотеки OpenSSL расположены там, где CMake может их обнаружить. Если вы установили OpenSSL в нестандартное место, вам может потребоваться указать CMake, где искать файлы:
set(CMAKE_PREFIX_PATH "/path/to/openssl")
Заключение
Если после всех вышеперечисленных шагов ошибка не исчезла, рассмотрите возможность создания минимального примера кода, который иллюстрирует проблему. Это поможет изолировать проблему и упростит процесс поиска решения. На данном этапе вы также можете обратиться к документации конкретных библиотек или на форумы, чтобы получить рекомендации от сообщества.
Соблюдение грамотной структуры вашего проекта и правильная настройка CMake помогут вам избежать этих проблем в будущем.