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

Posted Hero_HL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cmake创建库和使用库工程示例(多个cmakelists)相关的知识,希望对你有一定的参考价值。

使用cmake构建一个工程,该工程创建了两个静态库,另外生成一个引用该两个静态库的可执行文件。

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

以上是关于cmake创建库和使用库工程示例(多个cmakelists)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用cmake生成基于静态库的动态链接库

Android OpenCVVisual Studio 创建支持 OpenCV 库的 CMake 工程 ④ ( OpenCV 官方代码示例 )

CMake--静态库与动态库构建

(转)HelloWorld CMake CMake中构建静态库与动态库及其使用

使用 cmake 如何静态链接一些库和动态链接其他库?

CMake 学习四:CMake 构建静态库和动态库