c++ - 使用特定 header 部署 C++ 共享库

标签 c++ cmake shared-libraries

我正在为内部个人项目创建一个 C++ 共享库,并且正在使用 cmake 进行链接/编译过程。现在我的 CMakeLists.txt 文件看起来像这样

cmake_minimum_required(VERSION 3.7)
project(borges)

set(CMAKE_BUILD_TYPE Release)

set(CMAKE_CXX_STANDARD 11)

include_directories(include)

file(GLOB SOURCES "src/*.cpp")

add_library(borges SHARED ${SOURCES})

install(TARGETS borges DESTINATION /usr/local/lib)

我已经成功地编译了我的文件,但我知道我有点担心“封装”。我想知道是否有一种方法可以只公开某些 .h 文件,因为有些类在我的库上下文之外使用没有多大意义。类似于库的“私有(private)”类,只公开那些人们会在外部使用的类

最佳答案

根据您的问题,我不确定您是否已经知道这一点,但是您当前的 CMakeLists.txt 没有安装任何 header 。要安装特定的,您需要做的就是列出要安装的 .h 文件并将它们传递给 CMake 的安装命令:

set(HEADERS_TO_INSTALL foo.h bar.h borges.h)
# ...
install(FILES ${HEADERS_TO_INSTALL} DESTINATION include)

附带说明一下,在您的 install(DESTINATION) 参数中使用相对路径是更好的做法。这些将相对于 CMAKE_INSTALL_PREFIX 变量进行解释,其默认值实际上是 /usr/local

如果你真的想禁止人们链接到内部类,那么你可能需要查看 GCC 的 visibility control

关于c++ - 使用特定 header 部署 C++ 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43991518/

相关文章:

c++ - 从windbg堆输出垃圾摘要

linux - 符号查找错误 : ./executableName: undefined symbol :_ZN18QXmlDefaultHandlerC2Ev

c++ - 为什么CMake通过相对路径链接外部库?

C++ 逗号运算符混淆

c++ - 非静态数据成员初始值设定项仅适用于 -std=c++11 或 -std=gnu++11

cmake - 使用 cmake + cpack 构建时如何签署 Windows 二进制文件和 NSIS 安装程序

c++ - 在编译过程中找不到 QMainWindow

c++ - cmake 在 Windows 上找不到 openssl

gcc - 版本脚本和隐藏可见性

c++ - react 任务在检测任务通知之前等待