繁体   English   中英

使用多个头文件使用 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/),其中包含我的公共标头请求的所有必要标头(以及我的公共标头请求的标头可以请求的其他标头) , 等等)? 在这种情况下,我想将“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM