如何使用CMake查找RelWithDebInfo或MinSizeRel库?

Lui*_*uis 5 cmake

我正在尝试将我的项目链接到我也开发的外部库,其中也使用CMake构建.当我尝试像这样找到RelWithDebInfo或MinSizeRel时:

FIND_LIBRARY(PCM_LIBRARY_DEBUG pcm
    PATHS   @CMAKE_LIBRARY_OUTPUT_DIRECTORY@
            @CMAKE_LIBRARY_OUTPUT_DIRECTORY@/Debug
    NO_DEFAULT_PATH
)
FIND_LIBRARY(PCM_LIBRARY_RELEASE pcm
    PATHS   @CMAKE_LIBRARY_OUTPUT_DIRECTORY@
            @CMAKE_LIBRARY_OUTPUT_DIRECTORY@/Release
            @CMAKE_LIBRARY_OUTPUT_DIRECTORY@/MinSizeRel
            @CMAKE_LIBRARY_OUTPUT_DIRECTORY@/RelWithDebInfo
    NO_DEFAULT_PATH
)

SET(PCM_LIBRARIES debug ${PCM_LIBRARY_DEBUG} optimized ${PCM_LIBRARY_RELEASE})
Run Code Online (Sandbox Code Playgroud)

它不会搜索非Release或Debug的ather目录.我也尝试创建PCM_LIBRARY_RELWITHDEBINFO和PCM_LIBRARY_MINSIZEREL,但同样的事情发生,因为SET中只有调试和优化的前缀.任何人都知道如何链接正确的库?

Com*_*sMS 7

不幸的是,这是使用的缺点之一find_library.没有引入大量的样板代码,没有简单的方法.

这里的问题是,当将文件作为依赖项传递时target_link_libraries,您只能区分debugoptimized.如果需要更细粒度的控制,则必须直接操作各自的目标属性LINK_INTERFACE_LIBRARIES.这不仅非常麻烦,还需要详细了解CMake物业系统的内部运作.

幸运的是,还有另一种方法:上述限制仅适用于通过文件名指定依赖项.将它们指定为目标时,不会发生此问题.最明显的例子是,如果一个库和依赖它的可执行文件是从同一个源构建的:

add_library(foo_lib some_files.cpp)
add_executable(bar_exe more_files.cpp)

target_link_libraries(bar_exe PUBLIC foo_lib)
Run Code Online (Sandbox Code Playgroud)

这'只是有效'.将为每个构建配置选择正确的库.如果库和可执行文件存在于不同的独立项目中,事情会变得复杂一些.在这种情况下,除了二进制文件之外,库还必须提供带有导出目标配置文件.

find_library依赖可执行文件现在只是加载该配置文件,然后可以使用导入的目标,就好像它是来自同一项目的目标一样,而不是调用二进制文件.

许多现代图书馆已经使用这种方法而不是经典find_library技术(Qt5是一个突出的例子).因此,如果您可以自由地更改依赖关系的CMakeLists,并且您不需要支持非常旧的CMake版本(<2.6),这可能是要走的路.