cmake学习(二) 创建库并使用find_package查找包.md

Catalogue
  1. 1. cmake学习(二) 创建库并使用find_package查找包

cmake学习(二) 创建库并使用find_package查找包

https://blog.csdn.net/u014572215/article/details/106105627

Mastering_CMake的第五章创建自己的包,并在其他的工程中使用find_package查找自己的创建的包

ide是clion,gcc环境是MinGW

工程目录和文件

![](cmake学习(二) 创建库并使用find_package查找包/1.png)

1、创建一个源文件gromit.cpp和头文件gromit.h作为自己创建的包的对象,gromit.cpp中只有一个函数,打印一条消息

1
2
3
4
5
6
gromit.h文件
class gromit {
public:
void info();

};

gromit.cpp文件

1
2
3
4
5
6
#include <iostream>
#include "gromit.h"

void gromit::info(){
std::cout << "Hello, info!" << std::endl;
}

2、创建项目的包配置文件,项目必须提供程序包配置文件,以便外部应用程序可以找到它们。考虑一个简单的项目“Gromit”,该项目提供了可执行文件以生成源代码以及一个库,生成的代码必须与该库链接。CMakeLists.txt文件的开头可能是:

1
2
3
4
5
6
7
8
9
10
cmake_minimum_required(VERSION 3.15)
project(Gromit)#工程名称
set(version 1.0)#设置版本
# Create library and executable.
#创建静态库,库名称是gromit
add_library(gromit STATIC gromit.cpp gromit.h)

add_executable(gromit-gen gromit_gen.cpp)
target_link_libraries(gromit-gen gromit)#链接库

为了安装Gromit并导出其目标以供外部项目使用

1
2
3
4
5
6
7
8
9
set(CMAKE_INSTALL_PREFIX D:/gromit)#设置安装位置,将头文件和库都安装到这个文章
# Install and export the targets.
#安装头文件
install(FILES gromit.h DESTINATION include/gromit-${version})
install(TARGETS gromit gromit-gen
DESTINATION lib/gromit-${version}
EXPORT gromit-targets)
install(EXPORT gromit-targets
DESTINATION lib/gromit-${version})

最后,Gromit必须在其安装目录中提供一个软件包配置文件,以便外部项目可以使用find_package包来定位它:

1
2
3
4
5
6
7
8
9
10
11
# Create and install package configuration and version files.
configure_file(
${Gromit_SOURCE_DIR}/pkg/gromit-config.cmake.in
${Gromit_BINARY_DIR}/pkg/gromit-config.cmake @ONLY)
configure_file(
${Gromit_SOURCE_DIR}/gromit-config-version.cmake.in
${Gromit_BINARY_DIR}/gromit-config-version.cmake @ONLY)
install(FILES ${Gromit_BINARY_DIR}/pkg/gromit-config.cmake
${Gromit_BINARY_DIR}/gromit-config-version.cmake
DESTINATION lib/gromit-${version})

此代码配置并安装程序包配置文件和相应的程序包版本文件。软件包配置输入文件gromit-config.cmake.in中包含代码,

1
2
3
4
5
6
7
# Compute installation prefix relative to this file.
get_filename_component (_dir "${CMAKE_CURRENT_LIST_FILE}" PATH)
get_filename_component (_prefix "${_dir}/../.." ABSOLUTE)
# Import the targets.
include ("${_prefix}/lib/gromit-@version@/gromit-targets.cmake")
# Report other information.
set (gromit_INCLUDE_DIRS "${_prefix}/include/gromit-@version@")

相应的软件包版本文件是从其输入文件gromit-config-version.cmake.in配置的,其中包含以下代码

1
2
3
4
5
6
7
8
set(PACKAGE_VERSION "@version@")
if (NOT "${PACKAGE_FIND_VERSION}" VERSION_GREATER "@version@")
set(PACKAGE_VERSION_COMPATIBLE 1) # compatible with older
if ("${PACKAGE_FIND_VERSION}" VERSION_EQUAL "@version@")
set(PACKAGE_VERSION_EXACT 1) # exact match for this version
endif ()
endif ()

3、安装库,如下图所示,在clion的:Build-Install

![](cmake学习(二) 创建库并使用find_package查找包/2.png)

将在安装路径下生成库和头文件

![](cmake学习(二) 创建库并使用find_package查找包/3.png)

4、完整的CMakeLists.txt文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
cmake_minimum_required(VERSION 3.15)
project(Gromit)#工程名称
set(version 1.0)#设置版本
# Create library and executable.
#创建静态库,库名称是gromit
add_library(gromit STATIC gromit.cpp gromit.h)

add_executable(gromit-gen gromit_gen.cpp)
target_link_libraries(gromit-gen gromit)#链接库

set(CMAKE_INSTALL_PREFIX D:/gromit)#设置安装位置,将头文件和库都安装到这个文章
# Install and export the targets.
#安装头文件
install(FILES gromit.h DESTINATION include/gromit-${version})
install(TARGETS gromit gromit-gen
DESTINATION lib/gromit-${version}
EXPORT gromit-targets)
install(EXPORT gromit-targets
DESTINATION lib/gromit-${version})

# Create and install package configuration and version files.
configure_file(
${Gromit_SOURCE_DIR}/pkg/gromit-config.cmake.in
${Gromit_BINARY_DIR}/pkg/gromit-config.cmake @ONLY)
configure_file(
${Gromit_SOURCE_DIR}/gromit-config-version.cmake.in
${Gromit_BINARY_DIR}/gromit-config-version.cmake @ONLY)
install(FILES ${Gromit_BINARY_DIR}/pkg/gromit-config.cmake
${Gromit_BINARY_DIR}/gromit-config-version.cmake
DESTINATION lib/gromit-${version})

5、创建一个项目调用生成的库gromit

![](cmake学习(二) 创建库并使用find_package查找包/4.png)

完整的CMakeLists.txt文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cmake_minimum_required(VERSION 3.15)
project(MyProject)

set(CMAKE_CXX_STANDARD 14)
#查找库,查找刚才创建的gromit库
find_package(gromit 1.0 REQUIRED
PATHS D:/gromit)#设置查找路径,如果没有这个路径,就要设置环境变量
include_directories(${gromit_INCLUDE_DIRS})#添加依赖
message(${gromit_INCLUDE_DIRS})#会输出"D:/gromit/include/gromit-1.0"
# run imported executable
add_custom_command(OUTPUT generated.cpp
COMMAND gromit-gen generated.cpp)

add_executable(myexe generated.cpp)
target_link_libraries(myexe gromit)
# link to imported library

add_executable(MyProject main.cpp)
target_link_libraries(MyProject gromit)#链接库

6、main.cpp主函数如下

1
2
3
4
5
6
7
8
9
#include <iostream>
#include "gromit.h"//使用创建的库
int main() {
std::cout << "Hello, World!" << std::endl;
gromit g;
g.info();
system("pause");
return 0;
}

7、运行结果如下

![](cmake学习(二) 创建库并使用find_package查找包/5.png)

但是无法看到gromit中的info()函数的实现。