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改一下,再编译就通过了