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

2fjabf4q  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(186)

我已经创建了一个“自包含”的C共享库,它使用了两个额外的库,即OpenCL和Boost C
理想情况下,这个库应该是自包含的,也就是说,外部应用程序不必显式地链接到OpenCL和Boost,而是直接链接到我的库。
但是,使用g++(而不是使用CMake)编译外部应用程序时,除了显式指定头文件(使用-Isub/library/path)之外,还要求用户知道OpenCL和Boost的头文件的位置。
有没有办法让CMake生成一个包含子库头文件路径的库?这样用户只需链接到我的库,而不必负责提供子库头文件的路径。
谢谢

vfh0ocws

vfh0ocws1#

对于使用带目标的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)。
注意:我认为如果你想处理安装,你需要做一些额外的工作。请参阅this post by @Lucas Guesser

相关问题