是否可以在CMake脚本中获得链接库的列表,因为它将被传递到链接器?

lskq00tm  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(142)

我需要得到一个表单中所有链接库的列表,因为它们将被传递到我的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文档中找到它。

oalqel3c

oalqel3c1#

是的,这是可能的-我知道一种方法,如何获得这个一旦文件生成,但我不认为这是可能的(至少不是在一个直接的方式在CMakeLists.txt文件本身)。
我曾经调试过一个链接依赖问题,必须“弄清楚”传递给链接器的是什么。

  • 通过cmake -S. -Bbuild通过CMake生成构建文件
  • 已获取构建文件夹,例如grep -Ri "[-]lmylibrary*" ./build

结果是,只有一个特定的文件成为感兴趣的,即:

./build/CMakeFiles/target_name.dir/link.txt

这一个文件包含正在馈送到链接器/编译器的内容。
编辑:我可能还会补充一点,修改这个文件确实会影响构建。所以如果你想做一个“黑客”来解决你的问题,你总是可以在构建之前运行一个脚本。

但是我相信如果配置正确,CMake可以很好地处理您的问题。例如通过set_target_properties

相关问题