c++ - 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)
我不明白为什么首先找到该库,但无法将其链接为其包名。但它通过提供完整路径来工作。我很感激任何见解!
解决方案
该库不在您的链接器路径中。例如,您的链接器查看/link
并且您在/home
. 您知道在哪里查找并且可以在文件浏览器中看到它,但链接器不会找到它,因为它只在“/link”中查找。
'find_package' 查找包并设置一些变量,但它不会更改链接器路径。
您必须自己设置链接器路径。在大多数情况下find_package
,设置一个包含链接器路径的变量。
find_package
提供一些功能,如catkin_package()
. 这些函数设置您的构建环境。
catkin_package() 是 catkin 提供的 CMake 宏。这是为构建系统指定 catkin 特定信息所必需的,该信息又用于生成 pkg-config 和 CMake 文件。
必须在使用 add_library() 或 add_executable() 声明任何目标之前调用此函数。
推荐阅读
- python - 包含默认 ID 作为参数不起作用
- ruby-on-rails - 区分链接以根据所选链接更改一页
- clang - 如何使用“clang”启用“cfi”为“aarch64”编译“.c”文件?
- php - 从单击的表行中获取 id 并显示该行的值
- php - WordPress 按类别名称获取帖子不起作用
- javascript - axios 调用,使用 vue 将响应数据获取到选择选项中
- unit-testing - 测试 .Net Core Identity GetUserAsync
- c++ - 分支预测是否仍在显着加快数组处理速度?
- python - 使用 Azure Key Vault 和 Active Directory 检索机密
- ansible - 无法在 Debian 伸展的 Ansible 2.7 上使用 NPM 包安装 PM2