使用多个标头使用 CMake 创建C++共享库
Creating a C++ Shared Library with CMake using several headers
我是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:${} 和 "${}" 之间的区别
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息