之前那本书讲得比较难,而且没有具体的示例,需要有对编程有点深入分析才能弄懂,那本书是培养cmake专家的。
所以现在换本简单易行的教材,先理解CMakeLists.txt,然后才可以做深入分析。
学习cmake完全是因为cocos2d-x都是用cmake构建的。
在家目录下创建一个目录cmake
进入cd cmake
mkdir t1
cd t1
还是和之前一样编写Hello World程序,弄清楚一些目录结构。
在t1目录下新建main.c和CMakeLists.c文件
main.c
1 // main.c
2 #include <stdio.h>
3
4 int main() {
5 printf("Hello World from t1 Main!\n");
6 return 0;
7 }
CMakeLists.txt
1 PROJECT (HELLO)
2 SET(SRC_LIST main.c)
3 MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
4 MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
5 ADD_EXECUTABLE(hello ${SRC_LIST})
在t1目录下执行cmake .
wang@wang:~/cmake/t1$ cmake .
-- This is BINARY dir /home/wang/cmake/t1
-- This is SOURCE dir /home/wang/cmake/t1
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wang/cmake/t1
wang@wang:~/cmake/t1$ make
Scanning dependencies of target hello
[ 50%] Building C object CMakeFiles/hello.dir/main.c.o
[100%] Linking C executable hello
[100%] Built target hello
可以看到二进制的目录是/home/wang/cmake/t1
源文件的目录是/home/wang/cmake/t1
这里两个文件的目录是相同的,也可以不同。
在文件的目录中,还可以看到系统为我们自动生成了cmake_install.cmake, CMakeCache.txt Makefile 和CMakeFiles目录。
然后输入make
wang@wang:~/cmake/t1$ make
Scanning dependencies of target hello
[ 50%] Building C object CMakeFiles/hello.dir/main.c.o
[100%] Linking C executable hello
[100%] Built target hello
可以看到构建成功。
执行./hello
wang@wang:~/cmake/t1$ ./hello
Hello World from t1 Main!
这里已经完成了cmake的基本用法。
简单的解释:CMakeLists.txt是cmake的构建定义文件,需要确保每个要管理的目录都存在一个CMakeLists.txt文件。
PROJECT指定工程的名称,这个指令隐式地定义了两个变量<projectname>_BINARY_DIR <projectname>_SOURCE_DIR
同时cmake系统也为我们定义了两个变量PROJECT_BINARY_DIR PROJECT_SOURCE_DIR
以后可以直接使用这两个变量。
SET 指令的语法是:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING] [FORCE]])
用来显式地定义变量。
MESSAGE 指令的语法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
FATAL_ERROR会生成错误立刻终止cmake过程。
ADD_EXECUTABLE()生成可执行文件
清理工程make clean
外部构建和内部构建举例,强烈推荐外部构建
解开 wxGTK 后。
在其中建立 static 和 shared 目录。
进入 static 目录,运行../configure –enable-static;make 会在 static 目录生
成 wxGTK 的静态库。
进入 shared 目录,运行../configure –enable-shared;make 就会在 shared 目录
生成动态库。
通过外部编译进行工程构建,HELLO_SOURCE_DIR 仍然指代工程路径,即
/backup/cmake/t1
而 HELLO_BINARY_DIR 则指代编译路径,即/backup/cmake/t1/build
已经完成了基本构建,下面是一个更加实用化的工程
1,为工程添加一个子目录 src,用来放置工程源代码;
2,添加一个子目录 doc,用来放置这个工程的文档 hello.txt
3,在工程目录添加文本文件 COPYRIGHT, README;
4,在工程目录添加一个 runhello.sh 脚本,用来调用 hello 二进制
4,将构建后的目标文件放入构建目录的 bin 子目录;
5,最终安装这些文件:将 hello 二进制与 runhello.sh 安装至/usr/bin,将 doc 目录
的内容以及 COPYRIGHT/README 安装到/usr/share/doc/cmake/t2
2032 mkdir src
2033 mv main.c src/
2034 cd src/
2035 ls
2036 vim CMakeLists.txt
2037 cd ..
2038 vim CMakeLists.txt //把生成可执行文件放在这里
2039 mkdir build
2040 cd build/
2041 cmake ..
2042 vim ../src/CMakeLists.txt // 如下所示
1 PROJECT (HELLOSET)
2 MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
3 MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
4 ADD_SUBDIRECTORY(src bin)
2043 cmake ..
2044 make
2045 ls
2046 cd bin/
2047 ls
2048 ./hello
不论是 SUBDIRS 还是 ADD_SUBDIRECTORY 指令(不论是否指定编译输出目录),我们都可
以通过 SET 指令重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量
来指定最终的目标二进制的位置。
DESTDIR=
install:
mkdir -p $(DESTDIR)/usr/bin
install -m 755 hello $(DESTDIR)/usr/bin
你可以通过:
make install
将 hello 直接安装到/usr/bin 目录,也可以通过 make install DESTDIR=/tmp/test 将他安装在
/tmp/test/usr/bin 目录,打包时这个方式经常被使用。