Компоновщик CMAKE не находит библиотеку;но библиотека найдена с помощью find_library - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть библиотека catkin под именем mylib, которую я создаю с помощью catkin build Кроме того, у меня есть узел, в котором используются функции из этой библиотеки.Я включил эту ссылку, как обычно в CMakeLists.txt узла:

find_package(catkin REQUIRED COMPONENTS
  mylib
)

add_executable(exec
  src/main.cpp
)

target_link_libraries(exec
  ${catkin_LIBRARIES}
)

Однако на этот раз это не удалось.Затем я добавил ошибку компоновщика:

find_package(catkin REQUIRED COMPONENTS
  mylib
)
find_library( MYLIB NAMES
    mylib
)
message(${MYLIB})

add_executable(exec
  src/main.cpp
)

add_dependencies(exec ${MYLIB})

target_link_libraries(exec
  ${catkin_LIBRARIES}
  ${MYLIB}
)

Дело в том, что оператор message () выводит правильный путь к библиотеке, где я также могу найти его в проводнике.Однако я получаю предупреждение:

(add_dependencies):   Policy CMP0046 is not set: Error on non-existent dependency in   add_dependencies.

, который ссылается на точно такой же путь к библиотеке и говорит, что он не существует.

Ошибка компоновщика:

/usr/bin/ld: cannot find -lmylib

Примечание: я мог бы устранить ошибку, добавив путь к библиотеке вручную

link_directories($ENV{HOME}/test/devel/lib)

Я не понимаю, почему библиотека была найдена первой, но не может быть связана как ее имя пакета.Но это работает, предоставляя полный путь.Я ценю любое понимание!

1 Ответ

0 голосов
/ 13 ноября 2018

Библиотека не находится в вашем пути компоновщика. Например. ваш компоновщик выглядит в /link, а у вас есть библиотека в /home. Вы знаете, где искать и видите его в своем файловом браузере, но компоновщик не найдет его, потому что он смотрит только в '/link'.

'find_package' ищет пакет и устанавливает некоторые переменные, но не меняет путь компоновщика.

Вы должны установить путь компоновщика самостоятельно. В большинстве случаев find_package устанавливает переменную, содержащую путь компоновщика.

find_package предоставляет некоторые функции, такие как catkin_package(). Эти функции устанавливают вашу среду сборки.

catkin_package () - это предоставляемый catkin макрос CMake. Это необходимо для указания специфичной для catkin информации для системы сборки, которая, в свою очередь, используется для генерации файлов pkg-config и CMake.

Эта функция должна вызываться перед объявлением любых целей с помощью add_library () или add_executable ().

...