CMAKE链接器找不到库;但是使用find_library找到了库

时间:2018-11-13 13:37:56

标签: c++ cmake ros catkin

我在名称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)

我不明白为什么首先找到该库,但无法将其作为程序包名称进行链接。但是它通过提供完整路径来起作用。 我感谢任何见识!

1 个答案:

答案 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()声明任何目标之前调用此函数。