[英]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/),其中包含我的公共标头请求的所有必要标头(以及我的公共标头请求的标头可以请求的其他标头) , 等等)? 在这种情况下,我想将“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:${} 和“${}”之间的区别
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.