【问题标题】:How to find RelWithDebInfo or MinSizeRel libraries with CMake?如何使用 CMake 查找 RelWithDebInfo 或 MinSizeRel 库?
【发布时间】:2014-01-31 11:13:47
【问题描述】:

我正在尝试将我的项目链接到我也在其中开发的外部库,该库也使用 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})

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

【问题讨论】:

标签: cmake


【解决方案1】:

不幸的是,这是使用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)

这“行得通”。将为每个构建配置选择正确的库。如果库和可执行文件存在于不同的独立项目中,事情会变得更加复杂。在这种情况下,除了二进制文件之外,库还必须提供 configure file with an exported target

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

许多现代库已经使用这种方法而不是经典的find_library 技术(Qt5 就是一个突出的例子)。因此,如果您可以随意更改依赖项的 CMakeLists,并且不需要支持非常旧的 CMake 版本(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-23
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多