Cmake学习 最开始加:cmake_minimum_required (VERSION 3.10.2) 一、Cmake介绍 1、cmake一款高级的编译配置工具 2、编译过程和配置步骤都是通过CMakeLists.txt来完成 二、Cmake操作流程 1、编写源码 cpp源代码 2、编写CMakeLists.txt PROJECT (HELLO) SET(SRC_LIST main.cpp) MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINGARY_DIR}) MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR}) ADD_EXECUTABLE(hello ${SRC_LIST}) 3、执行cmake编译 cmake . 4、生成Makefile文件 三、使用make编译Makefile 1、执行:make 2、生成输出文件:hello 3、执行:./hello 4、打印:hello 世界 四、CMakeLists.txt配置内容说明 1、PROJECT 可以用来指定工程的名字和支持的语言,默认支持所有语言 PROJECT(HELLO) 指定了工程的名称,并且支持所有语言-----建议 PROJECT(HELLO CXX) 指定了工程的名字,并且支持语言是 C++ PROJECT(HELLO C CXX) 指定了工程名字,并且支持语言是C和C++ 该指定隐士定义了两个CMAKE的变量 <projectname>_BINARY_DIR, 本例中是HELLO_BINARY_DIR <projectname>_SOURCE_DIR, 本例中是HELLO_SOURCE_DIR MESSAGE关键字可以直接使用这两个变量,当前都指向当前的工作目录,后面会将外部编译 问题:如果改变了工程名字,这两个变量名也会改变 解决:又定义两个预定义变量:PROJECT_BINARY_DIR和PROJECT_SOURCR_DIR,这两个变量和 HELLO_BINARY_DIR, HELLO_SOURCE_DIR是一致的。 2、SET关键字 用来显示指定变量 SET(SRC_LIST main.cpp) SRC_LIST变量就包含了main.cpp SET(SRC_LIST main.cpp test.cpp xxx.cpp) 来包含更多的cpp文件 3、MESSAGE关键字 向终端输出用户自定义的信息 主要包含三种信息: SEND_ERROR, 产生错误,生成过程被跳过 STATUS, 输出前缀为 - 的信息 FATAL_ERROR, 立即终止所有的cmake过程 4、ADD_EXECUTABLE关键字 生成可执行文件 ADD_EXECUTABLE(hello ${SRC_LIST}) 生成的可执行文件名字是hello ,源文件读取变量SRC_LIST 中的内容 上述例子也可以简化的写成: PROJECT(HELLO) ADD_EXECUTABLE(hello main.cpp) 注意:功成名的 HELLO 和生成的可执行文件 hello 是没有任何关系的 五、语法的基本原则 1、变量使用${}方式取值,但是在IF控制语句中是直接使用变量名字 2、指令(参数1 参数2....)参数使用括弧括起来,参数之间使用空格或分号分开。以上面的ADD_EXECUTABLE指令为例子,如果存在另外一个func.cpp源文件,就要写成: ADD_EXECUTABLE(hello main.cpp func.cpp)或者ADD_EXECUTABLE(hello main.cpp;func.cpp) 3、指令是大小写无关的,参数和变量大小写相关的。但,推荐全部使用大写指令 六、语法注意事项 1、SET(SRC_LIST main.cpp) 可以写成 SET(SRC_LIST "mian.cpp"), 如果源文件名中含有空格,就必须更要加双引号 2、ADD_EXECUTABLE(hello main)后缀可以不写,他会自动去找.c 和 .cpp,最好不要这样写,可能会有两个这样的文件main.cpp 和 mian 七、内部构建和外部构建 1、上述例子就是内部构建,他生产的临时文件特别多,不方便清理 2、外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响,强烈建议使用外部构建方式 八、让Hello World看起来更像一个工程 1、为工程添加一个子目录src,用来放置工程源代码 2、添加一个子目录doc,用来放置这个工程的文档hello.txt 3、在工程目录添加文本文件COPYRIGHT,README 4、在工程目录添加一个runhello.sh脚本,用来调用hello 二进制 5、将构建后的目标文件放入构建目录的bin子目录下 6、将doc目录的内容以及COPYRIGHT/README安装到/usr/share/doc/cmake/ 九、操作流程 1、删除build目录下的所有内容 2、新建src文件夹 3、将main.cpp移动到src目录下 4、每个目录下都要有一个CMakeLists.txt文件 5、在src目录下新建一个CMakeLists.txt文件 6、编写外层CMakeLists.txt PROJECT(HELLO) ADD_SUBDIRECTORY(src bin) 【*括号内的这句话只是解释ADD_SUBDIRECTORY: 将src子目录加入到工程,并指定编译输出(包含编译中间结果)路径为bin目录 如果不进行bin目录的指定,那么编译器结果(包括中间结果)都将放在build/src目录 *】 7、编写src目录下的CMakeLists.txt ADD_EXECUTABLE(hello main.cpp) 十、安装 1、一种是从代码编译后直接make install 安装 2、一种是打包时的指定 目录安装 简单的可以这样指定目录:make install DESTDIR=/tmp/test 稍微复杂一点可以这样指定目录:./configure -prefix=/usr 十一、如何安装HelloWorld 1、使用CMAKE一个新的指令:INSTALL INSTALL的安装可以包括:二进制、动态库、静态库以及文件、目录、脚本等 2、使用CMAKE一个新的变量:CMAKE_INSTALL_PREFIX 3、目录树结构 十二、安装文件COPYRIGHT和README 指令:INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/) FILES: 文件 DESTINATION: 1、写绝对路径 2、可以相对路径,相对路径实际路径是:${CMAKE_INSTALL_PREFIX}/<DESTINATION 定义的路 径> CMAKE_INSTALL_PREFIX 默认是在/usr/local/ cmake -DCMAKE_INSATLL_PREFIX=/usr 在cmake的时候指定CMAKE_INSTALL_PREFIX变量的路径 十三、安装脚本runhello.sh PROGRAMS: 非目标文件的可执行程序安装(比如脚本之类) 指令:INSTALL(PROGRAMS runhello.sh DESTINATION bin) 说明:实际安装到的是:/usr/bin 十四、安装doc中的hello.txt 1、是通过在doc目录建立CMakeLists.txt,通过INSTALL下的FILE 2、是直接在工程目录通过:INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake) 注释* DIRECTORY 后面连接的是所在Source目录的相对路径 abc和abc/有很大的区别 目录名不以/结尾:这个目录将被安装为目标路径下的abc 目录名以/结尾:将这个目录中的内容安装到目标路径 十五、安装过程 cmake .. make make install 十六、静态库和动态库的构建 任务: 1、建立一个静态库和动态库,提供HelloFunc 函数供其他程序编程使用,HelloFunc想终端输出Hello Wordl字符串。 2、安装头文件于共享库 静态库和动态库的区别 1、静态库的扩展名一般为“.a”或者 ".lib"; 动态库的扩展名一般为 ".so"或者 ".dll". 2、静态库在编译时会直接整合到目标程序中,编译成功后的可执行文件可独立运行; 3、动态库在编译时不会放到链接的目标程序中,即可执行文件无法单独运行 十七、构建实例 1、hello.h中的内容 2、hello.cpp中的内容 3、编写项目中的CMakeLists.txt的内容 4、编写lib中的CMkaeLists.txt中的内容 ADD_LIBRARY 解释: *hello:就是正常库的名字,生成的名字前面会自动加上lib,最终产生的文件是libhello.so *SHARED: 动态库;STATIC:静态库; *${LIBHELLO_SRC}: 源文件 5、进入build目录下 执行:cmake .. 用来生成Makefile 执行:make 用来编译Mackefile,生成动态库 十八、同时构建静态和动态库 1、SET_TARGET_PROPERTIES :这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库的版本和API版本 2、同时构建静态库和动态库 SET(LIBHELLO_SRC hello.cpp) ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC}) SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1) ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) SET_TARGET_PROPERTIES(hello PROPERTIES OUTPUT_NAME "hello") SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1) 十九、动态库的版本号 一般动态库都有一个版本号的关联 如:libhello.so.1.2 libhello.so ->libhello.so.1 libhello.so ->libhello.so.1.2 CMakeLists.txt 插入如下: SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1) VERSION指代动态库版本,SOVERSION指代API版本 二十、安装共享库和头文件 本例中我们将hello 的共享库安装到<prefix>/lib 目录,将hello.h安装到<prefix>/include/hello 目录; //文件放到该目录下 INSTALL(FILES hello.h DESTINATION include/hello) //二进制,静态库,动态库安装都用TARGETS //ARCHIVE 特指静态库,LIBRARY 特指动态库,RUNTIME 特指可执行目标二进制 INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) 注意* 安装的时候,指定一下路径,放到系统下 在build目录下 执行: cmake -DCMKE_INSTALL_PREFIX=/usr .. 再执行: make 再执行: make install 二十一、使用外部共享库和头文件 1、准备工作,新建一个目录来使用外部共享库和头文件 2、写main.cpp 二十二、解决make后头文件找不到的问题 PS:include <hello/hello.h>这样可以是可以,这么做的话,就没有什么好讲的了 关键字:INCLUDE_DIRECTORIES 这条指令可以用来向工程中添加多个特定的头文件搜索路径,路径之间用空格分割 在CMakeLists.txt中加入头文件搜索路径 INCLUDE_DIRECTORIES(/usr/include/hello) 二十三、找不到引用的函数问题 报错信息:undefined reference to "hellofunc()" 关键字:LINK_DIRCTORIES 添加非标准的共享库搜索路径 指定的第三方不在环境变量中的路径:LINK_DIRECTORIES(/home/youproject/libs) 关键字:TARGET_LINK_LIBRARIES 添加在系统环境变量下的需要链接的共享库 TARGET_LINK_LIBRARIES(mian libhello.so) 二十四、如果要链接静态库 TAEGET_LINK_LIBRARIES(hello libhello.a) 二十五、生成debug版本的方法 camke -DCMAKE_BUILD_TYPE=debug
标签:cmake,目录,学习,ADD,cpp,txt,hello From: https://www.cnblogs.com/RedWetPlace/p/17326624.html