1.include_directories。该命令是用来向工程添加多个指定头文件的搜索路径,路径之间用空格分隔。因为main.c里include了testFunc.h和testFunc1.h,如果没有这个命令来指定头文件所在位置,就会无法编译。当然,也可以在main.c里使用include来指定路径.
2.add_subdirectory()这个命令可以向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置.add_subdirectory (src),这里指定src目录下存放了源文件,当执行cmake时,就会进入src目录下去找src目录下的CMakeLists.txt,所以在src目录下也建立一个CMakeLists.txt. 最外层的CMakeLists.txt用于掌控全局,使用add_subdirectory来控制其它目录下的CMakeLists.txt的运行。
3.set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin),是用于定义变量的,EXECUTABLE_OUT_PATH和PROJECT_SOURCE_DIR是CMake自带的预定义变量,其意义如下,
EXECUTABLE_OUTPUT_PATH :目标二进制可执行文件的存放位置
PROJECT_SOURCE_DIR:工程的根目录
4.add_library: 生成动态库或静态库(第1个参数指定库的名字;第2个参数决定是动态还是静态,如果没有就默认静态;第3个参数指定生成库的源文件)
5.find_library:find_library(TESTFUNC_LIB testFunc HINTS ${PROJECT_SOURCE_DIR}/testFunc/lib)在指定目录下查找指定库,并把库的绝对路径存放到变量里,其第一个参数是变量名称,第二个参数是库名称,第三个参数是HINTS,第4个参数是路径,其它用法可以参考cmake文档
6.target_link_libraries: 把目标文件与库文件进行链接
7.add_definitions(-DWWW1)
8.aux_source_directory:cmake提供了一个命令可以把指定目录下所有的源文件存储在一个变量中,第一个参数dir是指定目录,第二个参数var是用于存放源文件列表的变量.
9.add_executable:
10.target_sources:指定编译给定目标时要使用的源。 命名的 <target> 必须是由 add_executable() 或 add_library() 等命令创建的.
11.target_include_directories:指定编译给定目标时要使用的包含目录或目标。切目标必须由 add_executable() or add_library()创建
12.find_library: FIND_LIBRARY(my_ceres libceres.so /home/wenhaolun/ubuntu18.04_lib/ceres/)该命令用于搜索指定动态文件路径,里面的内容为自定义的变量名、动态文件名、具体路径。
使用实例:
1.在引用tinyxml的时候,只加入了tinyXML.h,结果在编译的时候包undefine tinyXML里面的函数。在使用find_package时,如:find_package(tinyxml),find_package(tinyxml2)等都不成功,但是我搜索环境中是有FindTINYXML2.CMAKE文件的。
首先使用下面这种方法可以解决找不到库的问题。
file(GLOB TinyXML_LIBS /usr/lib/x86_64-linux-gnu/libtinyxml2.so)
list(APPEND ALL_LIBRARIES ${TinyXML_LIBS})
但是里面有绝对路径,然后使用
link_libraries(tinyxml2)
这种方法可以解决找不到库的问题。
LINK_LIBRARIES 介绍:
添加需要链接的库文件路径
语法:
link_libraries(library1 <debug | optimized> library2 ...)
# 直接是全路径link_libraries(“/home/server/third/lib/libcommon.a”)
# 下面的例子,只有库名,cmake会自动去所包含的目录搜索link_libraries(iconv)# 传入变量link_libraries(${RUNTIME_LIB})
# 也可以链接多个link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
可以链接一个,也可以多个,中间使用空格分隔.