cmake和cmake install学习

本文深入探讨了CMake的使用,包括设置C/C++编译标准、理解CMAKE_SOURCE_DIR等变量、if-else逻辑、静态与动态库的生成,以及install流程。还介绍了如何设置静态链接libstdc++、使用ExternalProject_Add模块和FetchContent引入第三方库,以及add_custom_target的用法。此外,详细讲解了cmake install的常见步骤、错误处理、CPack生成RPM包,以及ctest的测试命令。

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

cmake

https://www.jianshu.com/p/7326f9167fae
https://blog.youkuaiyun.com/weixin_34319640/article/details/87972767

设置cmake的C/C++编译标准

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)

CMAKE_SOURCE_DIR、PROJECT_SOURCE_DIR等含义

https://www.cnblogs.com/3d-gis/articles/14398733.html
CMAKE_SOURCE_DIR确实是指定义了顶级CMakeLists.txt的文件夹;
PROJECT_SOURCE_DIR是指包含最近的project()命令的CMakeLists.txt的文件夹;
CMAKE_CURRENT_SOURCE_DIR 这是当前处理的CMakeLists.txt所在的目录;

使用-if-else的逻辑流程

https://blog.youkuaiyun.com/andrewgithub/article/details/108249065

if(expression1)
# commands ...
elseif(expression2)
# commands ...
else()
# commands ...
endif()

与、或、非:

# Logical operators
if(NOT expression)
if(expression1 AND expression2)
if(expression1 OR expression2)
# Example with parentheses
if(NOT (expression1 AND (expression2 OR expression3)))

生成某个二进制文件时设置被链接的libstdc++为静态链接模式

静态链接会直接把库大包至二进制程序中,用动态链接的话就不会(每次要动态加载)。比如本地工程要求的c++版本比较高,但是待安装的环境可能没有该版本对应的libstdc++库,从而导致程序无法运行,此时用静态库就比较方便。

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc")

add_library生成的默认是静态库还是动态库

https://blog.youkuaiyun.com/HandsomeHong/article/details/122401900
add_library()命令生成的默认库类型取决于第二个参数。如果第二个参数是STATIC,则生成静态库;如果第二个参数是SHARED,则生成动态库。如果没有指定第二个参数,则默认生成静态库。

include(InstallRequiredSystemLibraries)含义

在CMake中,include(InstallRequiredSystemLibraries)是一个命令,用于包括一个模块,该模块将搜索编译器提供的系统运行库并添加安装规则。它还会自动包括MSVC MFC运行时库,并安装所有列在CMAKE_INSTALL_DEBUG_LIBRARIES和CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS中的文件到/bin(在Windows上)或/lib(在Linux和OSX上)。

file()命令读写文件、创建目录等

https://blog.youkuaiyun.com/weixin_42730667/article/details/122568165
可以通过file()命令读写文件、创建目录等,具体参考上面链接,介绍得很详细。

判断某个变量是否定义

在CMake中,可以使用if(DEFINED )来判断某个变量是否定义了。如果定义了,则返回真;否则返回假。下面是一个示例:

if(DEFINED <variable>)
    message("Variable is defined.")
else()
    message("Variable is not defined.")
endif()

获取顶层项目的版本号

可以使用 CMAKE_PROJECT_VERSION 变量来获取顶层项目的版本号。该变量保存了项目的版本号,由顶层 CMakeLists.txt 文件中的 project() 命令指定。如果顶层 CMakeLists.txt 包含多个 project() 调用,则最近从该顶层 CMakeLists.txt 调用的调用将确定 CMAKE_PROJECT_VERSION 包含的值。

如果您想将该变量传递到子目录中,可以使用 set 命令定义一个缓存内部变量,然后在子目录中使用该变量。例如,您可以在顶层 CMakeLists.txt 文件中定义以下内容:set(MY_PROJECT_VERSION ${CMAKE_PROJECT_VERSION} CACHE INTERNAL “”),然后在子目录中使用 ${M

### CMake与`make install`的区别及用途 #### CMake的作用 CMake是一个跨平台的构建系统生成器,用于管理软件编译过程。它通过读取项目中的配置文件(通常是`CMakeLists.txt`),来生成适用于不同环境下的本地构建脚本或工程文件。这使得开发者可以在多种操作系统工具链之间轻松切换而无需修改源码。 对于给定的例子,在`talker/CMakeLists.txt`中定义了项目的最低CMak版本需求、项目名称以及依赖项等内容[^2]: ```cmake cmake_minimum_required(VERSION 2.8.3) project(talker) find_package(catkin REQUIRED COMPONENTS roscpp std_msgs) catkin_package() include_directories(${catkin_INCLUDE_DIRS}) add_executable(talker talker.cpp) target_link_libraries(talker ${catkin_LIBRARIES}) install(TARGETS talker RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) ``` 这段代码指定了如何找到必要的ROS组件并设置链接库路径;同时也说明了可执行文件的位置及其安装目标位置。 #### `make install`的功能 一旦使用CMake完成了构建系统的配置,并且已经调用了`make`命令进行了实际编译之后,则可以利用`make install`来进行最终的产品部署工作。“安装”的概念在这里指的是将已编译好的二进制文件复制到指定的目标目录下以便于后续的应用程序能够正常访问这些资源。通常情况下,默认会把它们放置在系统的标准路径里如`/usr/local/bin`或其他由用户自定义的地方。 因此,在上述例子中提到的最后一行就是用来指示当执行`make install`时应该怎样处理这个名为`talker`的应用程序——即将其移动至`${CATKIN_PACKAGE_BIN_DESTINATION}`所指向的具体地址处。 #### 实际操作流程对比 - **仅运行`cmake .`** - 解析`CMakeLists.txt`文件。 - 配置好整个项目的结构框架。 - 准备好所有预处理器宏定义其他辅助信息供接下来可能发生的编译阶段使用。 - **接着执行`make`** - 开始依据之前准备的信息真正意义上地去编译各个模块直至产出完整的应用程序镜像。 - **最后再做一次`sudo make install`** - 把刚才得到的结果正式迁移到预期的工作环境中,使之成为可用状态的一部分。 综上所述,虽然两者都是为了完成同一个目的即让新开发出来的功能能够在计算机内稳定运作起来,但是各自扮演的角色却截然不同:前者负责前期准备工作,后者则专注于后期的实际安置环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值