我在名称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)
我不明白为什么首先找到该库,但无法将其作为程序包名称进行链接。但是它通过提供完整路径来起作用。 我感谢任何见识!
答案 0 :(得分:1)
该库不在您的链接器路径中。例如。您的链接器显示在/link
中,而您在/home
中有一个lib。您知道在哪里可以看到,并且可以在文件浏览器中看到它,但链接器找不到它,因为它仅在'/ link'中出现。
'find_package'查找软件包并设置一些变量,但它不会更改链接器路径。
您必须自己设置链接器路径。在大多数情况下,find_package
会设置一个包含链接器路径的变量。
find_package
提供了一些功能,例如catkin_package()
。这些功能设置您的构建环境。
catkin_package()是catkin提供的CMake宏。这是向构建系统指定特定于catkin的信息所必需的,而构建系统又将其用于生成pkg-config和CMake文件。
必须在使用add_library()或add_executable()声明任何目标之前调用此函数。