cmake practice cmake实践

本文介绍了CMake的基础用法,包括理解CMakeLists.txt,创建并构建Hello World程序,以及如何进行更复杂的工程管理,如添加子目录、文档和脚本。通过实例演示了CMake的配置、编译和安装过程,适合CMake入门学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前那本书讲得比较难,而且没有具体的示例,需要有对编程有点深入分析才能弄懂,那本书是培养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 目录,打包时这个方式经常被使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值