首页 > 解决方案 > CMAKE 链接器找不到库;但是通过 find_library 找到了库

问题描述

我有一个名为 mylib 的 catkin 库,我用它构建了它。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)

我不明白为什么首先找到该库,但无法将其链接为其包名。但它通过提供完整路径来工作。我很感激任何见解!

标签: c++cmakeroscatkin

解决方案


该库不在您的链接器路径中。例如,您的链接器查看/link并且您在/home. 您知道在哪里查找并且可以在文件浏览器中看到它,但链接器不会找到它,因为它只在“/link”中查找。

'find_package' 查找包并设置一些变量,但它不会更改链接器路径。

您必须自己设置链接器路径。在大多数情况下find_package,设置一个包含链接器路径的变量。

find_package提供一些功能,如catkin_package(). 这些函数设置您的构建环境。

catkin_package() 是 catkin 提供的 CMake 宏。这是为构建系统指定 catkin 特定信息所必需的,该信息又用于生成 pkg-config 和 CMake 文件。

必须在使用 add_library() 或 add_executable() 声明任何目标之前调用此函数。


推荐阅读