#c #cmake #open62541
#c #cmake #open62541
Вопрос:
После нескольких часов поиска решения в Интернете (я знаю, что есть несколько похожих вопросов, но ни один из них не помог) Я близок к тому, чтобы сдаться, так что помощь очень ценится.
Предварительно: я хочу использовать библиотеку C99 open62541 для моего собственного проекта на C . Я использовал адекватные варианты сборки для PubSub, поскольку это то, что меня больше всего интересует. Я также настроил путь установки на /home/user/install/open62541
.
Описание проблемы: Сначала я смог построить все, как ожидалось, с помощью этого CMakeLists.txt . Но на данный момент я пытаюсь добавить возможности подписки open62541 в проект, но CMake отказывается связывать библиотеку с проектом, как и предполагалось:
- Я скопировал этот пример кода из учебных пособий в проект и добавил
add_executable(subscriber ${CMAKE_CURRENT_SOURCE_DIR}/tutorial_pubsub_subscribe.cpp)
иtarget_link_libraries(subscriber PUBLIC open62541)
в свой CMakeLists.txt . - CMake жалуется на следующее:
undefined reference to 'UA_PubSubConnection_regist'
- Затем я перешел в папку lib моего пути установки, чтобы найти
libopen62541.so
и - проверил общий объект с помощью команды nm
nm libopen62541.so | grep UA_PubSubConnection_regist
- nm вернул «t»,
поэтому я полагаю, что сборка open62541 не может быть причиной ошибки связывания.
Комментарии:
1. Я не понимаю, почему find_library — это не все, что вам нужно? Эта функция устанавливает выходную переменную, имя которой используется вами с target_link_libraries для вашего исполняемого файла.
2. Я пробовал find_library(open62541) в нескольких вариантах, но, к сожалению, это, похоже, не помогло.
3. Если вы знаете точный путь к своей библиотеке, то просто передайте этот проход в target_link_libraries , например
target_link_libraries(subscriber PUBLIC /home/user/install/open62541/lib/libopen62541.so)
. Если это не устраняет ошибку «неопределенная ссылка», значит, проблема не вCMakeLists.txt
этом.4. Вместо того, чтобы указывать полный путь в
target_link_libraries
, я бы вместо этого указал импортированный целевой объект, поскольку это позволяет подключать включенные каталоги и т. Д. тоже и может быть способом указания разных lib-файлов для разных конфигураций.add_library(open62541 SHARED IMPORTED) set_target_properties(open62541 PROPERTIES IMPORTED_LOCATION /home/user/install/open62541/lib/libopen62541.so) target_include_directories(open62541 INTERFACE /home/user/install/open62541/include)
или аналогичный. Сначала проверьте, включает ли установка конфигурационный файл cmake, хотя, поскольку он уже будет содержать это5. Я проверю ваши предложения и сообщу об обновлении, когда найду решение. большое вам спасибо.