使用多个标头使用 CMake 创建C++共享库

Creating a C++ Shared Library with CMake using several headers

本文关键字:C++ 创建 共享 CMake      更新时间:2023-10-16

我是CMake的新手,我试图在Ubuntu中开发一个共享库。 我已经设法创建了一些基本的CMakeLists.txt文件,该文件允许我编译一个非常简单的库,只有一个头和一个源文件。

事实上,我的项目树是:

.
├── CMakesList.txt
├── First.h
|
└── src
└──First.cpp

我能够使用这个答案来做CMakeLists.txt文件。

但是,后来我尝试通过向库添加Second类来为示例增加一点复杂性。

现在,我的公共标头First.h也导入了include/Second.h。项目树如下所示:

.
├── CMakesList.txt
├── First.h
|
└── include
|    └──Second.h
|
└── src
└──First.cpp
└──Second.cpp

我已经对 CMakesList 文件进行了必要的更改,如下所示:

cmake_minimum_required(VERSION 3.1...3.15)
project(First VERSION 1.0 
DESCRIPTION "It does very little"
LANGUAGES CXX)
include(GNUInstallDirs)
add_library(First SHARED 
src/First.cpp
src/Second.cpp)
set_target_properties(First PROPERTIES
VERSION ${PROJECT_VERSION}
PUBLIC_HEADER First.h)
configure_file(FIRST.pc.in FIRST.pc @ONLY)
target_include_directories(First PRIVATE .)
install(TARGETS First
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES ${CMAKE_BINARY_DIR}/First.pc
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)

并且此文件也成功运行。它构建库时没有错误。

但是,现在,当我链接库并在另一个项目中使用它时,它无法编译,并给我以下错误:

/usr/local/include/First.h:36: error: include/Second.h: No such file or directory
#include "include/Second.h"
^~~~~~~~~~~~~~

所以我想我的问题是:

我怎样才能创建一个目录(在本例中为/usr/local/include/(,其中包含我的公共头文件请求的所有必要头文件(以及我的公共头文件请求的头文件可以请求的其他头文件等(?在这种情况下,我想将"包含"目录包含在我的公共标头所在的同一目录中。

对不起,愚蠢的问题,我只是在探索!

提前感谢!

首先,您必须声明所有标头。我不知道有什么方法可以使用 cmake 自动查找标头依赖项(GLOB不是一种选择(。如果您懒惰,可以复制粘贴ls -1 include的输出。或者,您可以创建gcc -MM First.h的检查输出。

如果您只想在/usr/local/include/first中安装Second.h,我认为下面的代码应该可以工作:

install(FILES include/Second.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/first)

但是,也许所有标头都应该放在/usr/local/include/first中,一切都更容易:

set_target_properties(First PROPERTIES
VERSION ${PROJECT_VERSION}
PUBLIC_HEADER "First.h;include/Second.h")
install(TARGETS First
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/first)

请注意,PUBLIC_HEADER接受一个参数,此参数是一个列表。语法PUBLIC_HEADER First.h include/Second.h(不带双引号(将仅将First.h作为参数传递。另请参阅:CMake:${} 和 "${}" 之间的区别