Ссылка CMake на стороннюю библиотеку C (open62541)

#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. Я проверю ваши предложения и сообщу об обновлении, когда найду решение. большое вам спасибо.