cmake创建库和使用库工程示例(多个cmakelists)

16 篇文章 1 订阅
14 篇文章 1 订阅

使用cmake构建一个工程,该工程创建了两个静态库,另外生成一个引用该两个静态库的可执行文件。
gitee链接:https://gitee.com/herohl/mycode.git

1.构建工程

在这里插入图片描述
该工程生成两个库liaadd.a和liabmul.a。一个工程管理的cmake,一个生成lib的cmake,一个生成可执行测试程序的cmake。

文件:add.h

int add(int a, int b);

文件:add.c

#include "add.h"

int add(int a, int b)
{
	return a + b;
}

文件:mul.h

int mul(int a, int b);

文件:mul.c

#include "mul.h"

int mul(int a, int b)
{
	return a * b;
}

文件:main.c

#include "add.h"
#include "mul.h"
#include <stdio.h>

int main()
{
	printf("3 + 5 = %d\n", add(3, 5));
	printf("3 * 5 = %d\n", mul(3, 5));
	return 0;
}

2.构建编译规则

首先我们要管理整个工程,告诉他目录在哪里,生成库在哪里,生成可执行文件在哪里…然后要去找到子目录在哪里去子目录再找cmake继续编译子目录的库和可执行文件。并且先生成库,再生成可执行文件(可执行文件依赖与这两个库)

根目录CMakeLists.txt(管理整个工程)

cmake_minimum_required (VERSION 2.8)					# cmake版本最低要求
project (test)
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)			# 设置了Debug版本和Release版本可执行文件的输出目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)			# 设置可执行文件的输出目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)			# 设置库文件的输出目录

include_directories (${PROJECT_SOURCE_DIR}/inc)				# 附加头文件目录

ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/libsrc)				# 先执行这个目录下的cmake
ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/src)					# 上个目录下生成库后,此时再链接生成可执行文件

ADD_SUBDIRECTORY就是可以找到子目录,执行子目录的cmake

子目录生成静态库的CMakeLists.txt

add_library(add STATIC ${PROJECT_SOURCE_DIR}/libsrc/add.c)
add_library(mul STATIC ${PROJECT_SOURCE_DIR}/libsrc/mul.c)

子目录引用静态库生成可执行文件的CMakeLists.txt

aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)		# 设置./src为源文件路径

add_executable (test ${SRC_LIST})						# 寻找源文件进行编译
target_link_libraries(test 
	${PROJECT_SOURCE_DIR}/lib/libadd.a 
	${PROJECT_SOURCE_DIR}/lib/libmul.a)						# 编译时需要链接的库

3.测试

在这里插入图片描述

在工程的根目录下创建构建目录并进入

mkdir build && cd build

构建makefile

cmake ..

在这里插入图片描述
编译 make
在这里插入图片描述
进入指定的可执行文件生成目录 project/bin 执行

cd ../bin
./test

在这里插入图片描述

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于大型的 C++ 项目,可能需要将代码分为多个模块,并使用多个 CMakeLists.txt 文件来管理它们。下面是一个使用多个 CMakeLists.txt 文件来管理 C++ 多文件项目的示例: 假设我们有以下项目结构: ``` myproject/ ├── CMakeLists.txt ├── module1/ │ ├── CMakeLists.txt │ ├── include/ │ │ └── module1.h │ └── src/ │ └── module1.cpp └── module2/ ├── CMakeLists.txt ├── include/ │ └── module2.h └── src/ └── module2.cpp ``` 其中,`myproject` 目录下的 `CMakeLists.txt` 文件是主 CMakeLists.txt 文件,它用于管理整个项目。`module1` 目录和 `module2` 目录是两个子模块,每个子模块都有自己的 `CMakeLists.txt` 文件、头文件和源文件。 现在,我们需要使用 CMake 来构建这个项目。我们可以在 `myproject` 目录下创建一个主 CMakeLists.txt 文件,并添加以下内容: ```cmake cmake_minimum_required(VERSION 3.10) project(myproject) # 添加子目录 add_subdirectory(module1) add_subdirectory(module2) ``` 该 CMakeLists.txt 文件指定了项目的最低 CMake 版本和项目名称。`add_subdirectory` 命令用于添加子目录,它告诉 CMake 去处理 `module1` 和 `module2` 这两个子目录中的 CMakeLists.txt 文件。 接下来,我们需要在 `module1` 目录下创建一个名为 `CMakeLists.txt` 的文件,并添加以下内容: ```cmake # 添加头文件搜索路径 include_directories(include) # 添加源文件 add_library(module1 src/module1.cpp) # 暴露头文件 target_include_directories(module1 PUBLIC include) ``` 该 CMakeLists.txt 文件指定了 `module1` 子模块的构建规则。`include_directories` 命令添加了头文件搜索路径,它告诉 CMake 在 `include` 目录中查找头文件。`add_library` 命令编译 `module1.cpp` 源文件并生成一个静态文件 `libmodule1.a`。最后,`target_include_directories` 命令将 `include` 目录暴露给其他模块,以便它们可以包含 `module1.h` 头文件。 然后,在 `module2` 目录下创建一个名为 `CMakeLists.txt` 的文件,并添加以下内容: ```cmake # 添加头文件搜索路径 include_directories(include) # 添加源文件 add_library(module2 src/module2.cpp) # 暴露头文件 target_include_directories(module2 PUBLIC include) ``` 该 CMakeLists.txt 文件指定了 `module2` 子模块的构建规则,与 `module1` 子模块类似。 完成以上步骤后,我们可以使用以下命令来构建项目: ```bash mkdir build cd build cmake .. make ``` `mkdir build` 创建了一个构建目录,`cd build` 进入该目录,`cmake ..` 命令使用上面的主 CMakeLists.txt 文件来构建项目,`make` 命令编译源代码并生成可执行文件。 这就是一个使用多个 CMakeLists.txt 文件来管理 C++ 多文件项目的示例

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值