title: CMake速记
date: 2019/11/18 19:17:40
toc: true
---linux
#顶层 cmake_minimum_required(VERSION 3.16) PROJECT(DCU) SET(PLAT_FORM_THIS linux) SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) if(PLAT_FORM_THIS STREQUAL "linux") SET(PLAT_FORM linux) else() SET(PLAT_FORM arm) SET(CMAKE_SYSTEM_NAME Linux) SET(CMAKE_C_COMPILER "arm-linux-gcc") SET(CMAKE_CXX_COMPILER "arm-linux-g++") endif() #SET(CMAKE_SYSTEM_NAME Linux) #SET(CMAKE_C_COMPILER "arm-linux-gcc") #SET(CMAKE_CXX_COMPILER "arm-linux-g++") SET(INCLUDE_DIR /home/layty/work/pan/dcu-cmake/dcu_ubuntu/dc/include) SET(PROJECT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${PLAT_FORM}/) # 有两个子目录 ADD_SUBDIRECTORY(third_party) ADD_SUBDIRECTORY(dc) #------------------------------------------------------------------- # 子层若是仍是目录的话 ADD_SUBDIRECTORY(task) ADD_SUBDIRECTORY(thread) #----------------------------------------------------------------- # 子层是源文件,生成lib INCLUDE_DIRECTORIES(${INCLUDE_DIR}) # 搜索全部源文件 AUX_SOURCE_DIRECTORY(. SRC) # 这个是生成lib的路径 SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) # 生成lib ADD_LIBRARY(base SHARED ${SRC}) #--------------------------------------------------------------- # 子层是源文件,生成lib INCLUDE_DIRECTORIES(${INCLUDE_DIR}) AUX_SOURCE_DIRECTORY(. SRC) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/) ADD_EXECUTABLE(xxxexexxx ${SRC}) #连接 # 添加非标准的共享库搜索路径 LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/${PLAT_FORM}/ ${PROJECT_BINARY_DIR}/${PLAT_FORM}/lib ) #为 target 添加须要连接的共享库 TARGET_LINK_LIBRARIES(xxxexexxx pthread sqlite3 zlog crypto)
1. mkdir build && cd build 2. cmake .. 3. make
内部变量sql
PROJECT_BINARY_DIR 构建目录,这里若是是外部构建这里是build PROJECT_SOURCE_DIR 仍是工程目录,也就是 cmake 后面的 .. 也就是这里是父目录 <projectname>_BINARY_DIR <projectname>_SOURCE_DIR
(projectname)
和可执行的文件名没有什么关系https://cmake.org/cmake/help/v3.16/manual/cmake-commands.7.htmlubuntu
PROJECT(projectname [CXX] [C] [Java]) SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...) ADD_EXECUTABLE (<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [source1] [source2 ...]) #添加子目录, binary_dir为在build的重命名的生成目录 #EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程当中排除,好比,工程的example,可能就须要工程构建完成后,再进入 example 目录单独进行构建 add_subdirectory(source_dir [ binary_dir] [EXCLUDE_FROM_ALL]) #指定最终的目标二进制的位置,不包含编译生成的中间文件 # 使用add_subdirectory 的bin指定的生产的目录下有临时文件 很差看 # 在哪里 ADD_EXECUTABLE 或 ADD_LIBRARY,若是须要改变目标存放路径,就在哪里加入上述的定义 # 这样就能够指定多个 exe lib的路径 SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) install(TARGETS <target>... [...]) install({FILES | PROGRAMS} <file>... [...]) install(DIRECTORY <dir>... [...]) install(SCRIPT <file> [...]) install(CODE <code> [...]) install(EXPORT <export-name> [...]) #例子 #cmake -DCMAKE_INSTALL_PREFIX=/usr . #CMAKE_INSTALL_PREFIX 的默认定义是/usr/local # ${CMAKE_INSTALL_PREFIX}/<DESTINATION 定义的路径> INSTALL(TARGETS targets... [[ARCHIVE|LIBRARY|RUNTIME] # .a,.so,.o [DESTINATION <dir>] # 安装的路径,/开头为绝对路径,若是要使用CMAKE_INSTALL_PREFIX 指定则要用相对路径 [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [OPTIONAL] ] [...]) # 例子 INSTALL(TARGETS myrun mylib mystaticlib RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION libstatic ) # 可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录 # 动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录 # 静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录 # EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其余的组件依赖或者手工构建。 add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2 ...]) # 设置输出目标的属性 SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...) #例子 将hello_static 的名字改成hello ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC}) SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") # cmake 在构建一个新的 target 时,会尝试清理掉其余使用这个名字的库,由于,在构建 libhello.a 时,就会清理掉 libhello.so. # 为了不清理,须要再设置 CLEAN_DIRECT_OUTPUT 属性 SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1) SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT1) # 得到目标属性,变量存在VAR 若是没有这个属性定义,则返回 NOTFOUND GET_TARGET_PROPERTY(VAR target property) # 设置版本号 SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1) #头文件,默认追加在后面 #1,CMAKE_INCLUDE_DIRECTORIES_BEFORE,经过 SET 这个 cmake 变量为 on,能够将添加的头文件搜索路径放在已有路径的前面。 #2,经过 AFTER 或者 BEFORE 参数,也能够控制是追加仍是置前。 INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...) #连接 # 添加非标准的共享库搜索路径 LINK_DIRECTORIES(directory1 directory2 ...) #为 target 添加须要连接的共享库 TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2...) # ldd src/main 查看结果 #连接到静态库 加入.a TARGET_LINK_LIBRARIES(main libhello.a) # 当前目录的全部文件 AUX_SOURCE_DIRECTORY(dir VARIABLE)
CMAKE_INCLUDE_PATH CMAKE_LIBRARY_PATH export 使用或者 CMAKE_INCLUDE_PATH=/home/include cmake .. 内部这么使用 hello.h # FIND_PATH 用来在指定路径中搜索文件名 # #FIND_PATH(myHeader NAMES hello.h PATHS /usr/include/usr/include/hello) FIND_PATH(myHeader hello.h) IF(myHeader) INCLUDE_DIRECTORIES(${myHeader}) ENDIF(myHeader) 一样的 CMAKE_LIBRARY_PATH 能够用在 FIND_LIBRARY 中
CMAKE_CURRENT_SOURCE_DIR #指的是当前处理的 CMakeLists.txt 所在的路径 CMAKE_CURRRENT_BINARY_DIR #target 编译目录,ADD_SUBDIRECTORY(src bin)能够更改这个变量的值 CMAKE_CURRENT_LIST_FILE #输出调用这个变量的 CMakeLists.txt 的完整路径 CMAKE_CURRENT_LIST_LINE #输出这个变量所在的行 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH #分别用来从新定义最终结果的存放目录,前面咱们已经提到了这两个变量。 PROJECT_NAME #返回经过 PROJECT 指令定义的项目名称
[x] cmake实践ui
[x] 快速入门指引(简书)debug
[ ] 一个更好的教程code
[ ] Learn CMake's Scripting Language in 15 Minutescomponent