在t1/main.c中写入
#include
int main()
{
printf("Hello World from t1 Main!\n");
return 0;
}
在t1/CMakeLists.txt中写入
PROJECT(HELLO)
SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
之后
PROJECT(projectname [CXX] [C] [Java])定义工程文件名以及支持的语言,隐式定义了两个变量
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) 显示定义变量,也可以定义多个变量:SET(SRC_LIST main.c t1.c t2.c)
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
SEND_ERROR,产生错误,生成过程被跳过
SATUS ,输出前缀为 — 的信息
FATAL_ERROR,立即终止所有 cmake 过程
ADD_EXECUTABLE(hello ${SRC_LIST}) 定义可执行文件hello, 相关源文件为SRC_LIST定义的源文件列表
变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
指令(参数 1 参数 2...)
指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令
首推使用build进行外部构建
通过外部编译进行工程构建,HELLO_SOURCE_DIR 仍然指代工程路径,即Code/CMakeLearning/t1.而 HELLO_BINARY_DIR 则指代编译路径,即Code/CMakeLearning/t1/build.
目录树
t2
-----CMakeLists.txt
-----build
-----src
-----------CMakeLists.txt
-----------main.c
其中各个文件夹的内容分别是
编译及运行
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。上面的例子定义了将 src 子目录加入工程,并指定编译输出(包含编译中间结果)路径为bin 目录。如果不进行bin 目录的指定,那么编译结果(包括中间结果)都将存放在build/src 目录(这个目录跟原有的 src 目录对应),指定 bin 目录后,相当于在编译时
将 src 重命名为 bin,所有的中间结果和目标二进制都将存放在 bin 目录。
指定最终的目标二进制的位置(指最终生成的 hello 或者最终的共享库,不包含编译生成的中间文件)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
在哪里 ADD_EXECUTABLE 或 ADD_LIBRARY, 如果需要改变目标存放路径,就在哪里加入上述的定义.
啊啊啊啊,太多了,需要用的时候直接看