cmake简单示例

本文介绍了一个简单的C++类Box的实现,包括成员函数的声明与定义,并通过CMake进行项目构建与管理。此外,还展示了如何利用CMakeLists.txt文件配置项目,以及如何在CMake中设置不同类型的构建目标。

1,代码头文件:example.h

#include<iostream>
using namespace std;
class Box
{
      double length;   // 长度
      double breadth;  // 宽度
      double height;   // 高度
   public:

      // 成员函数声明
      double get(void);
      void set( double len, double bre, double hei );
      //当声明了非默认的构造函数之后默认的构造函数就不能用了;
      //如果要用默认的构造函数则需要显示声明;
      Box(double len, double bre, double hei);
      Box();//显示声明默认的构造函数;
      ~Box();

};

2,代码源码: example.cc

#include "example.h"

// 成员函数定义
double Box::get(void)
{
    return length * breadth * height;
}
 
void Box::set( double len, double bre, double hei)
{
    length = len;
    breadth = bre;
    height = hei;
}

Box::Box(double len, double bre, double hei ){
    length = len;
    breadth = bre;
    height = hei;

}

Box::Box(void){
    cout << "BOX INITIALIZATION" << endl;
}

//如果cpp文件中定义了析构函数,那么头文件中也必须声明;
Box::~Box(void){
    cout << "BOX destroy" << endl;
}

int main(){
    
    Box box;
    box.set(0.2, 0.3, 0.4);
    cout << "box's area is " << box.get()<< endl;
    Box box1(0.1, 0.2, 0.4);
    cout << "box's area is " << box1.get()<< endl;

    int a[5] = {5, 2, 6, 8 ,9} ;

    for(int i = 0 ; i < 5; i++ ){
        int tmp = a[i];
        if (a[i] > a[i+1])
        {
            a[i] = a[i+1];
            a[i+1] = tmp;
        }
    }

    for(int i = 0 ; i < 5; i++ ){
        cout << a[i]<<" ";
    }
    cout << endl;
    
    
}

3,一个简单的CMakeList.txt

cmake_minimum_required(VERSION 2.8.3)
project(example)

#==============
# executables =
#==============

add_executable(example src/example.cc;src/example.h)

#可执行文件的名称为 example;
# 如果CmakeLists.txt与源文件在一个文件下 则不用指定目录;

4,目录结构:



5、基本的语法规则
使用${}方式来取得变量中的值,而在IF语句中则直接使用变量名。
指令(参数1 参数2 …)
参数之间使用空格或者分号分隔开。如果加入一个函数fun.c

ADD_EXETABLE(hello main.c;fun.c)
指令是大小写无关的,参数和变量是大小写相关的。但是推荐你全部使用大写指令。

6、关于语法的困惑
可以使用双引号“”将源文件包含起来。处理特别难处理的名字比如fun c.c,则使用SET(SRC_LIST "fun c.c")可以防止报错。

7、清理工程
可以使用make clean清理makefile产生的中间的文件,但是,不能使用make distclean清除cmake产生的中间件。如果需要删除cmake的中间件,可以采用rm -rf *来删除中间件。

8、外部构建

mkdir build
cmake ..
make

在目录下建立一个build文件用来存储cmake产生的中间件,不过需要使用cmake ..来运行。其中外部编译,PROJECT_SOURCE_DIR仍然指代工程路径,即/backup/cmake/t1,而PROJECT_BINARY_DIR指代编译路径,即/backup/cmake/t1/build。

9、运行

找到可执行文件的目录:

./example

10,运行结果

BOX INITIALIZATION
box's area is 0.024
box's area is 0.008
2 5 6 8 9 
BOX destroy
BOX destroy


 

<think>首先,用户的问题是关于CMake库的使用示例和教程。我需要基于系统指令来构建我的回答。 系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考的站内引用: - [^1]: CMake自带有很多有用的模块... - [^2]: CMakeLists.txt cmake_minimum_required... - [^3]: 下面的两个练习,将要完成的功能... - [^4]: 最外层的CMakeLists.txt如下... 这些引用是关于CMake的,特别是关于CMakeLists.txt的配置、模块使用、库的创建等。用户想要CMake库的使用示例和教程,所以我应该整合这些信息,并提供一个清晰的指南。 我的回答结构: 1. **介绍**:简要解释CMake库是什么以及为什么使用它。 2. **基础示例**:提供一个简单的创建和使用库的示例。 3. **进阶部分**:包括引用中的内容,如使用CMake模块、设置输出路径、添加使用要求等。 4. **完整指南**:基于引用[^1]和[^4],提供更详细的配置。 5. **相关问题**:生成相关问题。 确保使用中文回答。 现在,关于数学表达式:用户的问题是关于CMake的,可能不涉及数学,但如果有公式或表达式,我需要用LaTeX格式。例如,如果提到路径或变量,我可以使用行内数学表达式,如`$PROJECT_BINARY_DIR$`。 生成相关问题: - 基于用户的问题,生成2-3个相关问题,放在最后。 整合引用: - 在回答中自然地引用这些段落。例如,当提到CMake模块时,引用[^1];当提到基础配置时,引用[^2];当提到库的使用要求时,引用[^3];当提到输出路径设置时,引用[^4]。 大纲: 1. **引言**:解释CMake库的作用。 2. **创建库的简单示例**: - 使用`add_library`命令创建静态或共享库。 - 示例代码。 3. **使用库**: - 在另一个目标中链接库。 - 示例代码。 4. **进阶配置**: - 设置输出路径(引用[^4])。 - 添加使用要求,如包含目录(引用[^3])。 - 使用CMake模块(引用[^1])。 5. **完整示例**: - 提供一个更完整的CMakeLists.txt示例。 6. **相关问题**。 确保回答真实可靠:基于标准CMake实践和引用内容。 最终输出格式: - 使用Markdown。 - 代码块用于CMake代码。 - 引用标识在相关句子末尾。</think>### CMake库的使用示例和教程 CMake是一个强大的跨平台构建工具,用于管理C/C++等项目的编译过程。创建和使用库(如静态库或共享库)是CMake的核心功能之一,它能帮助模块化代码并提高复用性。下面我将通过一个结构化的指南,逐步介绍CMake库的创建、链接和进阶配置,确保内容真实可靠,基于标准CMake实践和参考文档[^1][^2][^3][^4]。 --- #### 1. **基础库创建与使用示例** 创建一个简单的库(例如一个数学函数库)并链接到可执行文件。假设项目结构如下: ``` project/ ├── CMakeLists.txt # 主配置文件 ├── include/ # 头文件目录 │ └── math_utils.h ├── src/ # 源文件目录 │ ├── math_utils.cpp │ └── main.cpp └── build/ # 构建目录 ``` **步骤1:创建库文件** 在`src/math_utils.cpp`中定义库函数(例如计算平方): ```cpp // src/math_utils.cpp #include "../include/math_utils.h" double square(double x) { return x * x; // 行内数学表达式示例:计算 $x^2$ } ``` **步骤2:配置CMakeLists.txt** 在主`CMakeLists.txt`中,使用`add_library`命令创建库,并设置输出路径: ```cmake cmake_minimum_required(VERSION 3.10) # 指定CMake最低版本 project(MathDemo) # 项目名称 # 添加库:创建静态库 libMathUtils.a add_library(MathUtils STATIC src/math_utils.cpp) # 设置库输出路径(引用CMake的输出路径配置[^4]) set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) # 库文件输出到 build/lib # 添加可执行文件并链接库 add_executable(main_app src/main.cpp) target_link_libraries(main_app PRIVATE MathUtils) # 链接库到可执行文件 # 指定头文件目录,确保使用库时能包含头文件 target_include_directories(MathUtils PUBLIC include) # 公开头文件路径 ``` 这里,`add_library`创建静态库,`target_link_libraries`链接库到可执行文件,`target_include_directories`确保头文件可见[^3]。 **步骤3:构建和运行** 在终端执行: ```bash mkdir build && cd build cmake .. make ./main_app # 运行可执行文件 ``` 此示例演示了如何创建基本库并链接使用。库文件(如`libMathUtils.a`)会生成在`build/lib`目录下[^4]。 --- #### 2. **进阶配置与最佳实践** 为了更高效地管理库,CMake提供了高级功能,如使用要求(usage requirements)和模块集成。 - **添加库的使用要求**: 使用`target_include_directories`的`INTERFACE`属性,可以让依赖库的目标自动继承头文件路径,避免手动设置。例如: ```cmake # 在库定义中添加使用要求 target_include_directories(MathUtils PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> # 构建时包含 $<INSTALL_INTERFACE:include> # 安装时包含 ) ``` 这样,任何链接`MathUtils`的目标(如`main_app`)会自动添加头文件路径,简化配置[^3]。 - **设置输出路径和安装规则**: 参考CMake的输出路径管理,可以全局设置库和可执行文件的输出位置: ```cmake # 设置库和可执行文件的输出目录(引用输出路径配置[^4]) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) # 可执行文件输出到 build/bin set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) # 库文件输出到 build/lib ``` 安装库到系统路径(如`/usr/local/lib`): ```cmake install(TARGETS MathUtils DESTINATION lib) # 安装库 install(FILES include/math_utils.h DESTINATION include) # 安装头文件 ``` - **使用CMake模块**: CMake自带标准模块(如`FindPackage`),简化第三方库的集成。例如,查找并链接OpenMP: ```cmake find_package(OpenMP REQUIRED) # 使用CMake内置模块 if(OpenMP_FOUND) target_link_libraries(MathUtils PUBLIC OpenMP::OpenMP_CXX) # 链接OpenMP endif() ``` CMake官网提供了丰富的模块文档,建议参考[cmake-modules](https://cmake.org/cmake/help/latest/manual/cmake-modules.7.html)以了解更多功能[^1]。 - **完整示例:多级目录项目** 对于大型项目,使用`add_subdirectory`管理子目录: ``` project/ ├── CMakeLists.txt ├── libs/ │ ├── MathUtils/ │ │ ├── CMakeLists.txt # 子目录配置库 │ │ ├── include/ │ │ └── src/ │ └── ... └── app/ ├── CMakeLists.txt # 配置可执行文件 └── src/ ``` 主`CMakeLists.txt`: ```cmake cmake_minimum_required(VERSION 3.10) project(AdvancedDemo) add_subdirectory(libs/MathUtils) # 包含库子目录 add_subdirectory(app) # 包含应用子目录 ``` 在`libs/MathUtils/CMakeLists.txt`中定义库,在`app/CMakeLists.txt`中链接: ```cmake # app/CMakeLists.txt add_executable(main_app src/main.cpp) target_link_libraries(main_app PRIVATE MathUtils) # 链接库 ``` 这种结构提高了代码的可维护性[^4]。 --- #### 3. **常见问题与解决方案** - **问题:库链接失败?** 确保使用`target_link_libraries`正确指定依赖关系,并检查头文件路径是否公开(使用`PUBLIC`或`INTERFACE`属性)。 - **问题:跨平台兼容性?** 使用`CMAKE_CXX_STANDARD`设置C++标准(如`set(CMAKE_CXX_STANDARD 11)`),避免编译器差异[^3]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值