分享

Cmake使用手册

 馆名不空 2014-03-09
CMAKE使用手册
简单例子:MAIN.C
我们以一个简单例子开始,逐步解析cmake的完整构建 过程 创建t1目录,在此目录下建立main.c main.c文件内容: //main.c #include int main() { printf(“Hello World from t1 Main!\n”); return 0; }

简单例子: CMAKELISTS.TXT
CMakeLists.txt,这个文件是cmake的构建定义文 件,文件名是大小写相关的,如果工程存在多个 目录,需要确保每个要管理的目录都存在一个 CMakeLists.txt 在t1目录建立CMakeLists.txt(注意文件名大小写) CmakeLists.txt文件内容:
PROJECT (HELLO) SET(SRC_LIST main.c) ADD_EXECUTABLE(hello SRC_LIST)

简单例子:语法规则
简单的解释构建文件CMakeLists.txt: PROJECT指令的语法是: PROJECT(projectname [CXX] [C] [Java]) 你可以用这个指令定义工程名称,并可指定工程支持 的语言,支持的语言列表是可以忽略的,默认情况表 示支持所有语言。 SET指令的语法是: SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) 只需要了解SET指令可以用来显式的定义变量即可。比 如我们用到的是SET(SRC_LIST main.c),如果有多个源 文件,也可以定义成:SET(SRC_LIST main.c t1.c t2.c)。

简单例子:语法规则
ADD_EXECUTABLE(hello ${SRC_LIST}) 定义了这个工程会生成一个文件名为hello的可 执行文件,相关的源文件是SRC_LIST中定义的 源文件列表, 本例中你也可以直接写成 ADD_EXECUTABLE(hello main.c)。另外,变量 使用${}方式取值,但是在IF控制语句中是直接 使用变量名

简单例子:开始构建
在CMakeLists.txt所在目录下运行cmake . (注意命令后面的点号,代表本目录)。系统自动 生成了CMakeFiles, CMakeCache.txt, cmake_install.cmake等文件,并且生成了 Makefile. 在这个目录输入make命令. 这时候,我们需要的目标文件hello已经构建完成, 位于当前目录 运行一下:./hello 得到输出:Hello World from Main

构建多目录工程
创建目录tmp,在此目录下分别创建目录include、source目 录及main.c文件。 在source目录下创建目录a,在a目录下创建文件afile.c: 内容如下 #include "../../include/tmp.h" #include void func_a() { printf("this is func_a\n"); }

构建多目录工程
在source目录下创建目录b,在b目录下创建文件 bfile.c: 内容如下 #include "../../include/tmp.h" #include void func_b() { printf("this is func_b\n"); }

构建多目录工程
在include目录下创建文件tmp.h: 内容如下 void func_a(); void func_b(); 在tmp目录下创建文件main.c:内容如下 #include "include/tmp.h" int main() { func_a(); func_b(); return 0; }

构建多目录工程
在tmp目录下创建文件CMakeLists.txt,内容如下: PROJECT (TMP) ADD_DEFINITIONS(-DPOSIX) AUX_SOURCE_DIRECTORY(source/a DIR_SRC_A) AUX_SOURCE_DIRECTORY(source/b DIR_SRC_B) SET(TMP_SRCS main.c ${DIR_SRC_A} ${DIR_SRC_B}
) ADD_EXECUTABLE(main ${TMP_SRCS})

语法规则
ADD_DEFINITIONS 向C/C++编译器添加-D定义,比如: ADD_DEFINITIONS(-DENABLE_DEBUG),参数之间 用空格分割。 也可设置编译器参数,例如ADD_DEFINITIONS(-g) AUX_SOURCE_DIRECTORY 基本语法是: AUX_SOURCE_DIRECTORY(dir VARIABLE) 作用是发现一个目录下所有的源代码文件并将列表 存储

动态库构建
以前面多目录工程tmp为例,只要将CMakeLists.txt改为如 下即可: PROJECT (TMP) ADD_DEFINITIONS(-DPOSIX) ADD_DEFINITIONS(-DDEBUG) AUX_SOURCE_DIRECTORY(source/a DIR_SRC_A) AUX_SOURCE_DIRECTORY(source/b DIR_SRC_B) SET(TMP_SRCS ${DIR_SRC_A} ${DIR_SRC_B} ) ADD_LIBRARY(tmp SHARED ${TMP_SRCS})

静态库
以前面多目录工程tmp为例,只要将CMakeLists.txt改为如 下即可: PROJECT (TMP) ADD_DEFINITIONS(-DPOSIX) ADD_DEFINITIONS(-DDEBUG) AUX_SOURCE_DIRECTORY(source/a DIR_SRC_A) AUX_SOURCE_DIRECTORY(source/b DIR_SRC_B) SET(TMP_SRCS ${DIR_SRC_A} ${DIR_SRC_B} ) ADD_LIBRARY(tmp STATIC ${TMP_SRCS})

安装共享库和头文件
以安装动态共享库为例,只需在CMakeLists.txt添 加: INSTALL(TARGETS main LIBRARY DESTINATION lib) 通过:静态库则添加 INSTALL(TARGETS main ARCHIVE DESTINATION lib) 头文件安装命令: INSTALL(FILES include/tmp.h DESTINATION include/lib) 通过: cmake -DCMAKE_INSTALL_PREFIX=/usr . make make install 我们就可以将头文件和共享库安装到系统目录

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多