一、cmake编译
由于cmake过程会⽣成了⼀些⽆法⾃动删除的中间⽂件,所以一般选择第二种方式
在当前工程目录下
mkdir build cd build cmake .. make
二、单个目录构建可执行文件
# 单个目录实现 # CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 工程,他不是执行文件名 PROJECT(test) # 手动加入文件 ${变量名}} ,比如${SRC_LIST} SET(SRC_LIST main.c) SET(SRC_LIST2 main2.c) # MESSAGE和echo类似 MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR}) MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR}) # 生产执行文件名test1 test2 ADD_EXECUTABLE(test1 ${SRC_LIST}) ADD_EXECUTABLE(test2 ${SRC_LIST2})
三、单个目录 添加库
添加头文件目录、添加链接库目录、引用动态库\静态库
# 单个目录实现 # CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 工程 PROJECT(0VOICE) # 手动加入文件 SET(SRC_LIST main.c) MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR}) MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR}) # 添加头文件目录 INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/lib") # 添加链接库目录 LINK_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/lib") # 引用动态库 ADD_EXECUTABLE(darren ${SRC_LIST}) TARGET_LINK_LIBRARIES(darren Dir1) #下面方式是强制找静态库 #TARGET_LINK_LIBRARIES(darren libDir1.a) #TARGET_LINK_LIBRARIES(darren lDir1)
四、多级目录
根目录下的CMakeLists.txt
# CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) PROJECT(TEST) ADD_SUBDIRECTORY(src bin) MESSAGE(STATUS "TOP CMAKE_CURRENT_SOURCE_DIR -> " ${CMAKE_CURRENT_SOURCE_DIR}) #INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/0voice) #INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/0voice)
src目录下的CMakeLists.txt
# 单个目录实现 # CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 工程 # PROJECT(TEST) # 手动加入文件 SET(SRC_LIST main.c) MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR}) MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR}) #设置子目录 set(SUB_DIR_LIST "${CMAKE_CURRENT_SOURCE_DIR}/dir1" "${CMAKE_CURRENT_SOURCE_DIR}/dir2") foreach(SUB_DIR ${SUB_DIR_LIST}) #遍历源文件 aux_source_directory(${SUB_DIR} SRC_LIST) MESSAGE(STATUS "SUB_DIR-> " ${SUB_DIR}) MESSAGE(STATUS "SRC_LIST-> " ${SRC_LIST}) endforeach() # 添加头文件路径 INCLUDE_DIRECTORIES("dir1") INCLUDE_DIRECTORIES("dir2") ADD_EXECUTABLE(darren ${SRC_LIST} ) # 将执行文件安装到bin目录 INSTALL(TARGETS darren RUNTIME DESTINATION bin)
五、常用指令
1.PROJECT 设置工程名
project (mytest)
2.INCLUDE_DIRECTORIES 添加头文件目录
添加头文件路径
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/dir2")
3.LINK_DIRECTORIES 添加链接库目录
LINK_DIRECTORIES(/home/myproject/libs)
把该路径添加到第三方库搜索路径中,这样就可以使用相对路径了
4.TARGET_LINK_LIBRARIES 添加链接库
LINK_DIRECTORIES把该路径添加到第三方库搜索路径中,这样就可以使用相对路径了,使用TARGET_LINK_LIBRARIES的时候,只需要给出动态链接库的名字就行了,比如:
????
TARGET_LINK_LIBRARIES(MyApp -lcurl )
对于这种,写的是dir1,实际上链接的是libdir1.a或libdir1.so
TARGET_LINK_LIBRARIES(darren dir1 dir2)
如果没写明白是libdir1.so还是libdir1.a,会优先链接动态库 (可以通过ldd命令查看链接状态,能查到状态就是链接了动态库,否则就是静态库)
或者加上l,也算是用静态库,(但是有so文件存在的情况,就会出现问题)
- 直接输入Dir1,默认用动态库
- libDir1.a,libDir1.so 用指定的静态或动态库
- lDir1,使用静态库,如果出现同名的动态库会报错
5.AUX_SOURCE_DIRECTORY
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
就是把 指定目录的所有文件全部添加到变量DIR_SRCS,上面用的是"."
,也就是把当前目录所有内容全部加入到DIR_SRCS里面
6.ADD_LIBRARY
生成动态库(使用SHARED)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
就可以构建一个libhello.so的动态库了
生成静态库(使用STATIC)
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
就可以构建一个libhello_static.a 的静态库了
使用 ADD_LIBRARY 并没有指定库类型的情况下,默认编译生成的库都是静态库
ADD_LIBRARY(hello_static ${LIBHELLO_SRC})
7.ADD_SUBDIRECTORY
添加一个子目录并构建该子目录
也就是说,除了会执行当前目录里的CMakeLists.txt,会执行ADD_SUBDIRECTORY子目录里面的CMakeLists.txt
六、常用变量
设置库输出路径
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/${BuildType})