gpt4 book ai didi

c++ - 共享库或 dylib 中 undefined symbol 的处理方式是什么?

转载 作者:IT老高 更新时间:2023-10-28 21:57:40 31 4
gpt4 key购买 nike

我有一个用于 linux 的 Makefile,我将其移植到 Darwin。 makefile 需要一堆 .o 文件并将它们链接在一起成为一个 .so 共享对象。好的,所以我想(我错了吗?) Darwin 最好的模拟是 dylib。所以我将 -shared 标志更改为 -dynamiclib。

现在我链接到 dylib 的代码依赖于许多外部库。当我尝试构建 dylib 时,我收到错误消息,提示存在 undefined reference 。但是 Linux Makefile 没有在创建 .so 文件的构建步骤中指定任何 -lwhatever 或 -L/path/whatever 选项。嗯?这是因为当您创建 ELF .so 文件时,默认情况下它会保留未解析的外部引用,然后在加载共享库时,它递归加载共享库所依赖的共享库您正在加载?如果共享库依赖于 .a 或 .o 文件,您是否必须将它们静态链接到共享库中,否则您无法在运行时链接?如果在运行时加载的库中存在 undefined reference ,除非这些引用也指向可动态加载的库,否则如何摆脱这种情况?

无论如何,如果我指定

-undefined suppress -flat_namespace

创建共享库时不需要我添加这些 -l 和 -L 选项。但我仍然不明白这最终如何发挥作用。

最佳答案

This thread也讨论了这个问题。我认为关键是为了获得类似 Linux 的链接行为,您需要指定“-undefined dynamic_lookup”标志。默认情况下,如果动态库中有任何 undefined reference ,Darwin 链接器会抛出错误。您还可以使用 -U 在每个符号的基础上设置此行为。请参阅“man ld”以供引用。

关于c++ - 共享库或 dylib 中 undefined symbol 的处理方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3695234/

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