c++ - CMake 生成器表达式到链接器

标签 c++ visual-studio linker cmake

我想使用 CMake 和 Visual Studio (lib.exe) 将几个静态库文件合并到一个库中。我想通过设置

将文件列表传递给链接器
set_target_properties(biglib PROPERTIES STATIC_LIBRARY_FLAGS 
                             "/unknown/path/lib1.lib /unknown/path/lib2.lib")

但是,路径在配置时是未知的。所以我尝试使用生成器表达式:

set_target_properties(biglib PROPERTIES STATIC_LIBRARY_FLAGS 
                             "$<TARGET_FILE:lib1> $<TARGET_FILE:lib2>")

lib1 和 lib2 是在别处定义的内部库目标。 该表达式似乎未被评估,因为链接器正在搜索 $<TARGET_FILE:lib1>当然没有找到。

我不知道我正在尝试做的事情是否会奏效。也许有人可以解释在这种情况下如何实际使用生成器表达式。我需要以某种方式使用 add_custom_command 吗?

最佳答案

合并静态库是一项相对复杂的任务,而且还依赖于平台和编译器。例如,对于 Linux/gcc,您需要通过 ar 从库中提取所有对象,然后将它们组合回合并库。

我建议使用 libutils.cmake 中的宏 MERGE_STATIC_LIBS|脚本,如此处所述:https://stackoverflow.com/a/4736442/1274747

对于 Linux/Unix,您需要 merge_archives_unix.cmake.in

关于c++ - CMake 生成器表达式到链接器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35010283/

相关文章:

c++ - 是否可以将 AddressSanitizer 和 ThreadSanitizer 合并到一个版本中?

c# - Microsoft.VisualStudio.TeamFoundation 引用在哪里?

c++ - 从 Excel 文件读取特定列到 C++

c++ - C4800 错误,使用 Visual Studio 2013 编译

c++ - 使用 lambda 作为 GLFWkeyfun

c++ - 检测文本数字太大而无法在 swift 中转换为 Int

c++ - Alglib 与 Cuda

visual-studio - 如何在visual studio中同时运行多个项目

c++ - Bison and doesn't name 类型错误

debugging - 如何告诉 gcc(或 ld)链接标准 c 和 c++ 库的调试版本