cmake学习1

官 网链接 https://cmake.org/

单个c文件构建

构建一个最简单的CMakeLists.txt只需要三步:
cmake_minimum_required(VERSION 3.20)
project(Hello)
add_executable(Hello Hello.c)

 cmake_minimum_required设置cmake的最小版本要求,写上比较稳妥。

project设置项目名称。

add_executable构建可执行文件。

通常我们在顶层CMakeLists.txt上建立一个文件夹build,是使用 out-of-source 方式,构建在build文件夹下执行命令cmake ..,make.

2.如果有多个源文件的情况下

其中mian.c需要用到hello.c里面的函数

project(HELLO)
set(SRC_LIST main.c hello.c)
add_executable(hello ${SRC_LIST})
在本例子中,CMakeLists.txt 文件中使用到了 set 命令,set 命令用于设置变量,如果变量不存在则创建 该变量并设置它;在本例中,我们定义了一个 SRC_LIST 变量,SRC_LIST 变量是一个源文件列表,记录生 成可执行文件 hello 所需的源文件 main.c hello.c,而在 add_executable 命令引用了该变量;当然我们也可 以不去定义 SRC_LIST 变量,直接将源文件列表写在 add_executable 命令中,如下:
add_executable(hello main.c hello.c)

也可以使用这个命令

file(GLOB_RECURSE MODULE_COMMON_SRC ./*.c)

也可以使用这个命令

aux_source_directory(./  MODULE_COMMON_SRC ) 

 这条语句的作用是在当前目录及其子目录中递归地搜索所有的.c文件,并将搜索到的文件路径列表存储在MODULE_COMMON_SRC变量中。

 最后

add_executable(hello ${MODULE_COMMON_SRC})

 3.生成库文件

我们还需要将 hello.c 编译为静态库文件或者动态库文件, 在示例二的基础上对 CMakeLists.txt 文件进行修改,如下所示:
project(HELLO)
add_library(libhello hello.c)
add_executable(hello main.c)
target_link_libraries(hello libhello)
add_library 命令用于生成库文件,在本例中我们传入了两个参数,第一个参数表示库文件的名字,需要 注意的是,这个名字是不包含前缀和后缀的名字;在 Linux 系统中,库文件的前缀是 lib,动态库文件的后 缀是.so,而静态库文件的后缀是.a;所以,意味着最终生成的库文件对应的名字会自动添加上前缀和后缀。
第二个参数表示库文件对应的源文件。
add_library(libhello SHARED hello.c) #生成动态库文件
add_library(libhello STATIC hello.c) #生成静态库文件

 target_link_libraries 命令为目标指定依赖库,在本例中,hello.c 被编译为库文件,并将其链接进 hello 程序。

修改生成的库文件名字

本例中有一点非常不爽,生成的库为 liblibhello.a,名字非常不好看;如果想生成 libhello.a 该怎么办? 直接修改 add_library 命令的参数,像下面这样可以吗?
add_library(hello hello.c)
答案是不行的,因为 hello 这个目标已经存在了(add_executable(hello main.c)),目标名对于整个工程 来说是唯一的,不可出现相同名字的目标,所以这种方法肯定是不行的,实际上我们只需要在 CMakeLists.txt 文件中添加下面这条命令即可:
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
set_target_properties 用于设置目标的属性,这里通过 set_target_properties 命令对 libhello 目标的 OUTPUT_NAME 属性进行了设置,将其设置为 hello
cmake_minimum_required(VERSION 3.5)
project(HELLO)
add_library(libhello SHARED hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
add_executable(hello main.c)
target_link_libraries(hello libhello)

示例四:将源文件组织到不同的目录

上面的示例中,我们已经加入了多个源文件,但是这些源文件都是放在同一个目录下,这样还是不太正规,我们应该将这些源文件按照类型、功能、模块给它们放置到不同的目录下,于是笔者将工程源码进行了 整理,当前目录结构如下所示:

 

我们来看看每一个 CMakeLists.txt 文件的内容。

顶层 CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(HELLO)
add_subdirectory(libhello)
add_subdirectory(src)

src 目录下的 CMakeLists.txt

include_directories(${PROJECT_SOURCE_DIR}/libhello)
add_executable(hello main.c)
target_link_libraries(hello libhello)

上述使用这个命令也行

 include_directories(${CMAKE_CURRENT_LIST_DIR})

 libhello 目录下的 CMakeLists.txt

add_library(libhello hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
顶层 CMakeLists.txt 中使用了 add_subdirectory 命令,该命令告诉 cmake 去子目录中寻找新的
CMakeLists.txt 文件并解析它;而在 src CMakeList.txt 文件中,新增加了 include_directories 命令用来指明头文件所在的路径,并且使用到了 PROJECT_SOURCE_DIR 变量,该变量指向了一个路径,从命名上可知, 该变量表示工程源码的目录。CMAKE_CURRENT_LIST_DIR变量指的是当前cmakelists所在路径。

示例五:将生成的可执行文件和库文件放置到单独的目录下

前面还有一点不爽,在默认情况下,make 编译生成的可执行文件和库文件会与 cmake 命令产生的中间 文件(CMakeCache.txtCmakeFilescmake_install.cmake 以及 Makefile 等)混在一起,也就是它们在同一 个目录下;如果我想让可执行文件单独放置在 bin 目录下,而库文件单独放置在 lib 目录下,就像下面这样:
将库文件存放在 build 目录下的 lib 目录中,而将可执行文件存放在 build 目录下的 bin 目录中,这个时 候又该怎么做呢?这个时候我们可以通过两个变量来实现,将 src 目录下的 CMakeList.txt 文件进行修改, 如下所示:
include_directories(${PROJECT_SOURCE_DIR}/libhello)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
add_executable(hello main.c)
target_link_libraries(hello libhello)

 然后再对 libhello 目录下的 CMakeList.txt 文件进行修改,如下所示:

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_library(libhello hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
此时便会按照我们的要求将生成的可执行文件 hello 放置在 build/bin 目录下、库文件 libhello.a 放置在 build/lib 目录下。最终的目录结构就如下所示:
其实实现这个需求非常简单,通过对 LIBRARY_OUTPUT_PATH ,EXECUTABLE_OUTPUT_PATH
变 量 进 行 设 置 即 可 完 成 ; EXECUTABLE_OUTPUT_PATH 变量控制可执行文件的输出路径,而 LIBRARY_OUTPUT_PATH 变量控制库文件的输出路径。

 也可以这样设置

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)

以上不行的话可能是版本问题,换一种变量即可。 

<think>嗯,用户想要查找关于CMake学习资料,包括教程和资源。我需要先整理现有的引用内容,看看有哪些可用的信息。根据用户提供的引用[1],里面有提到一个详细的CMake教程、构建应用程序的经验、使用CPack打包软件,以及一个视频教程《Getting Started with CMake》。这些都是很好的资源。引用[2]提到在CentOS 7上更新CMake的方法,可能对用户的环境配置有帮助。 首先,用户可能需要基础教程,所以应该推荐官方文档和那个超详细的教程。然后,视频教程可能更适合视觉学习者,所以需要提到。接着,实战经验和小技巧也很重要,比如如何组织项目结构,处理依赖等,引用里的“cmake的一些小经验”应该包含这些。CPack打包可能属于进阶内容,但用户可能有兴趣,所以也要列出来。 用户可能在使用旧版系统,比如CentOS 7,所以需要提醒他们升级CMake的方法,如通过EPEL或源码编译,这点在引用[2]里提到了。此外,可能需要补充其他资源,比如书籍或在线课程,虽然引用里没有,但可以建议《CMake Cookbook》和Udemy的课程作为补充。 然后,生成相关问题的时候,要考虑用户可能遇到的后续问题,比如基础学习资料、项目构建方法、处理依赖、跨平台配置、调试技巧,以及推荐的书籍或课程。这样能帮助他们进一步深入学习。 最后,确保回答结构清晰,分点列出,每个部分有对应的引用,并在末尾添加相关问题。检查是否符合之前的格式要求,比如数学表达式是否正确,但这个问题可能不涉及数学内容,所以主要关注资源推荐和步骤。</think>以下是关于CMake学习教程和资源的整理,结合系统级要求和实际应用场景: ### 一、基础学习资源 1. **官方文档与教程** - CMake官方文档是最权威的参考资料,涵盖语法、命令和模块说明[^1]。 - 推荐教程:[Linux下CMake使用教程](https://example-link.com),详细讲解项目构建流程,适合入门[^1]。 2. **视频教程** - 《Getting Started with CMake》:适合零基础学习,涵盖构建、测试和安装流程[^1]。 3. **实战经验** - 参考《CMake的一些小经验》,学习项目结构优化和依赖管理技巧[^1]。 ### 二、进阶内容 1. **跨平台构建** - 使用`CMAKE_TOOLCHAIN_FILE`配置交叉编译,例如嵌入式开发或Windows/macOS兼容性设置。 2. **依赖管理** - 通过`find_package`或`FetchContent`管理第三方库,例如集成OpenCV或Boost。 3. **打包与分发** - 使用CPack生成DEB/RPM包或Windows安装程序,简化部署流程。 ### 三、环境配置注意事项 - **CentOS 7用户**:系统自带的CMake版本较旧,建议通过EPEL仓库或源码编译升级[^2]。 示例升级命令: ```bash # 通过EPEL安装 sudo yum install epel-release sudo yum install cmake3 # 或源码编译 wget https://cmake.org/files/v3.25/cmake-3.25.1.tar.gz tar xzf cmake-3.25.1.tar.gz cd cmake-3.25.1 ./bootstrap && make && sudo make install ``` ### 四、推荐工具与扩展 - **IDE支持**:CLion、VS Code + CMake插件 - **调试技巧**:使用`message()`命令输出变量值,或`--debug-output`参数运行CMake
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hqb_newfarmer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值