我正在尝试将我的项目链接到我也开发的外部库,其中也使用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中只有调试和优化的前缀.任何人都知道如何链接正确的库?
不幸的是,这是使用的缺点之一find_library.没有引入大量的样板代码,没有简单的方法.
这里的问题是,当将文件作为依赖项传递时target_link_libraries,您只能区分debug和optimized.如果需要更细粒度的控制,则必须直接操作各自的目标属性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),这可能是要走的路.
| 归档时间: |
|
| 查看次数: |
963 次 |
| 最近记录: |