我需要得到一个表单中所有链接库的列表,因为它们将被传递到我的CMake脚本中的链接器。
例如,在我的CMake项目文件中,我定义了目标,它表示动态库的构建。我从另一个CMake文件中调用函数,以在我的目标中包含所有必需的静态库,最后如果我
set(CMAKE_VERBOSE_MAKEFILE ON)
我看到的输出如下所示:“clang++ -o /路径/到/程序。p/路径/到/库1.a/路径/到/库2.a”等等。
我需要得到一个字符串,它包含了所有静态库的列表,这些静态库链接到我的CMake脚本中的动态库。
get_target_property(l_libs2 ${target} LINK_LIBRARIES)
message("!!!LINK_LIBRARIES: ${l_libs2}")
但它包含的字符串格式如下:“图书馆::图书馆1;Library::Library 2”。我尝试从属性中获取相同的信息:接口链接库、LDFLAGS、库、链接标志、您使用的链接、链接选项...
原则上有可能吗?如何让CMake引擎为链接器“构建”这个参数?
为什么我需要它:
我需要从所有库中排除导出,只有一个除外。如果我传递到链接器选项
"-Wl,--exclude-libs,ALL"
当我的动态库(python扩展模块)加载到python中时,它会导致SEGFAULT。
"--exclude-libs,ALL"
从“python.a”库中排除导出。所以如果我更精确地设置排除列表,即
"-Wl,--exclude-libs,library1.a -Wl,--exclude-libs,library2.a"
等等,也就是除了“pythonidera”之外的所有库,模块加载到python没有任何问题。所以我决定动态生成这个编译器选项来获取库列表,然后,用正则表达式处理它。解决这个问题的最好方法是如果clang将有与“--exclude-libs”相反的选项,例如“--exclude-libs-except”(或类似的东西),但不幸的是,我没有在clang文档中找到它。
1条答案
按热度按时间oalqel3c1#
是的,这是可能的-我知道一种方法,如何获得这个一旦文件生成,但我不认为这是可能的(至少不是在一个直接的方式在
CMakeLists.txt
文件本身)。我曾经调试过一个链接依赖问题,必须“弄清楚”传递给链接器的是什么。
cmake -S. -Bbuild
通过CMake生成构建文件grep -Ri "[-]lmylibrary*" ./build
结果是,只有一个特定的文件成为感兴趣的,即:
这一个文件将包含正在馈送到链接器/编译器的内容。
编辑:我可能还会补充一点,修改这个文件确实会影响构建。所以如果你想做一个“黑客”来解决你的问题,你总是可以在构建之前运行一个脚本。
但是我相信如果配置正确,CMake可以很好地处理您的问题。例如通过
set_target_properties