让我们考虑一下Debian或Ubuntu发行版,在那里人们可以安装一些库程序包,比如说libfoobar
个,以及相应的libfoobar-dev
个库程序包.第一个包含共享库对象.后者通常包含头文件、静态库变量和cmake导出的目标(比方说,FoobarTargets.cmake
),这使得cMake类似find_package
的东西可以完美地工作.为此,FoobarTargets.cmake
必须包含两个目标:静态目标和共享变量目标.
另一方面,我读了很多文章,指出我(作为libfoobar的作者)应该避免在CMakeLists.txt
中声明add_library(foobar SHARED ....)
和add_library(foobar_static STATIC ...)
,而是支持使用BUILD_SHARED_LIBS=ON
和BUILD_SHARED_LIBS=OFF
构建和安装库.但是这种方法只能将库的一个变体导出到FoobarTargets.cmake
中,因为后面的构建将覆盖第一个.
因此,问题是:如何以正确的方式做到这一点?因此,包维护人员将不需要补丁程序库CMakeLists.txt
来从一侧正确地导出这两个变体.并坚持CMake的真实方式,删除仅在静态/共享方面与另一边不同的重复目标?