使用特定 headers 部署 C++ 共享库
Deploy c++ shared library with specific headers
我正在为一个内部个人项目创建一个 C++ 共享库,我正在使用 cmake 进行 linking/compilation 进程。现在我的 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)
我已经成功编译了我的文件,但我知道我有点担心 "encapsulation"。我想知道是否有办法只公开某些 .h 文件,因为有一些 类 在我的库上下文之外使用没有多大意义。像库的 "private" 类 之类的东西,只公开那些人们会在外部使用的 类
根据您的问题,我不确定您是否已经知道这一点,但是您当前的 CMakeLists.txt 没有安装任何 headers。要安装特定的,您需要做的就是列出要安装的 .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++ 共享库,我正在使用 cmake 进行 linking/compilation 进程。现在我的 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)
我已经成功编译了我的文件,但我知道我有点担心 "encapsulation"。我想知道是否有办法只公开某些 .h 文件,因为有一些 类 在我的库上下文之外使用没有多大意义。像库的 "private" 类 之类的东西,只公开那些人们会在外部使用的 类
根据您的问题,我不确定您是否已经知道这一点,但是您当前的 CMakeLists.txt 没有安装任何 headers。要安装特定的,您需要做的就是列出要安装的 .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