使用CMake创建一个自包含的c++共享库

Create a self contained c++ shared library with CMake

本文关键字:包含 c++ 共享 一个 创建 CMake 使用      更新时间:2023-10-16

我创建了一个"自包含"的C++共享库,它使用了另外两个库,即OpenCL和Boost C++。为此,我使用了CMake。

理想情况下,库将是自包含的,即外部应用程序不必显式链接到OpenCL和Boost。相反,他们只会链接到我的图书馆。

然而,使用g++编译外部应用程序(不使用CMake)需要用户知道OpenCL和Boost的头文件的位置,此外还需要显式指定它们(使用-I*sub/library/path*)。

有没有一种方法可以让CMake生成一个库,其中包含属于子库的头的路径?这样,用户只需要链接到我的库,而不负责提供子库头的文件路径。

感谢

对于任何使用带有目标的CMake的人,您可以通过将OpenCL和Boost指定为库的PUBLICINTERFACE链接库来实现这一点,如:

target_link_libraries(my_library PUBLIC OpenCL::OpenCL Boost::Boost)

target_link_libraries的文档状态:

PUBLICPRIVATEINTERFACE关键字可用于在一个命令中指定链接依赖项和链接接口。PUBLIC之后的库和目标链接到链接接口,并成为链接接口的一部分。PRIVATE之后的库和目标被链接到,但不是链接接口的一部分。INTERFACE之后的库被附加到链接接口,并且不用于链接<target>

不仅将使INTERFACE_LINK_LIBRARIES的链接标志可传递,而且还将目标包含目录(只要这些包含目录在与具有target_include_directories的依赖性目标关联时也被指定为PUBLICINTERFACE。)

注意:如果你想处理安装,我认为你需要做一些额外的工作。请参阅@Lucas Guesser的这篇文章。