gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:08:19 28 4
gpt4 key购买 nike

我正在尝试将我的项目链接到我也在其中开发的外部库,该库也使用 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 中只有调试和优化前缀。任何人都知道如何链接正确的库?

最佳答案

不幸的是,这是使用 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 版本(<2.6),那么这可能是可行的方法。

关于cmake - 如何使用 CMake 查找 RelWithDebInfo 或 MinSizeRel 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21478708/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com