linux cmake调用库的顺序,cmake教程(二) 库的使用

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

include_directories

参数应该是find_package调用生成的* _INCLUDE_DIRS变量以及需要包含的任何其他目录。如果您使用catkin和Boost,则include_directories调用应如下所示:1

2# 先调用find_package(Boost catkin),才能使用下面两个宏

include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})

include是目录名,不是命令,一般放头文档。使用message函数发现catkin_INCLUDE_DIRS是/opt/ros/kinetic/include/usr/include

添加库路径1LINK_DIRECTORIES(/usr/lib/)

并不是必须的,如果能直接链接就不需要。

ADD_LIBRARY

生成库文档是ADD_LIBRARY,它的功能是用来指定库来构建。默认情况下,catkin构建共享库。

构建库如下PointManage:1

2

3

4

5

6

7add_library(PointManage src/point_manage.cpp)

target_link_libraries(PointManage

${catkin_LIBRARIES} -pthread -llog4cpp -lcgicc -lmysqlclient jsoncpp Qt5::Core Qt5::Xml

)

add_executable(point_node src/point_manage_node.cpp src/point_manage.cpp)

target_link_libraries(point_node ${catkin_LIBRARIES} -llog4cpp -lmysqlclient -pthread Qt5::Core Qt5::Xml)

库PointManage用到了Qt库,此时也需要加上target_link_libraries命令,编译才能成功。

也可以不做成库文档,直接作为源文档和调用它的源文档一起编译,生成可执行文档point_node,在这里链接Qt库。但是如果多处用到了point_manage.cpp,就要每个链接Qt库,不够方便。

链接库

target_link_libraries必须放在add_executable(或者add_library)的后面。一般要先写好后者,然后再链接库:1

2

3

4

5add_executable(test "main.c")

target_link_libraries(test

${catkin_LIBRARIES}

)

但是注意,如果是生成动态库文档,最好不要再让它链接其他库文档,有时会失败。对于静态库,禁止链接其他库。

查看是否链接动态库成功,可以使用Linux的ldd命令

install命令

安装网上下载的库时常常最后一步是make install,这是使用CMake的install函数完成的,该函数的参数:1

2

3

4TARGETS 目标安装

ARCHIVE DESTINATION 静态库和DLL(Windows).lib存根

LIBRARY DESTINATION 非DLL共享库和模块

RUNTIME DESTINATION 可执行目标和DLL(Windows)样式共享库

ROS的launch文档可以安装到${CATKIN_PACKAGE_SHARE_DESTINATION}:1

2

3install(DIRECTORY launch/

DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch

PATTERN ".svn" EXCLUDE)

CMake问题

有时明明写好了,但编译会出现报错,看上去是CMakeLists中没有编译规则1

2

3

4

5

6make[2]: *** No rule to make target 'package/CMakeFiles/test_bin.dir/build'。 停止。

CMakeFiles/Makefile2:3192: recipe for target 'package/CMakeFiles/test_bin.dir/all' failed

make[1]: *** [package/CMakeFiles/test_bin.dir/all] Error 2

Makefile:138: recipe for target 'all' failed

make: *** [all] Error 2

Invoking "make -j4 -l4" failed

此时再重新编译仍然报错,只要把CMakeLists改一下,再编译就通过了

你可能感兴趣的:(linux,cmake调用库的顺序)