gpt4 book ai didi

c++ - Linux gcc 链接问题

转载 作者:行者123 更新时间:2023-12-03 07:07:09 25 4
gpt4 key购买 nike

我有两个库,名为( lib1 和 lib2) ,两者都不相互依赖。我无法控制这些库的构建方式。当我尝试链接它们时,链接顺序决定了最终可执行文件中的不同行为,
例如:
如果我将它们链接为 [1]

gcc $(CC_FLAGS) -o app.out -llib1 -llib2 
一切正常
但是,如果我将它们链接如下 [2]
gcc $(CC_FLAGS) -o app.out -llib2 -llib1 
可执行程序运行期间发生段错误。
有关此问题原因的任何建议或指示都会有所帮助。
更新:
这两个库都依赖于另一个动态库,即 Apache Thrift(版本 0.11.0),如果使用上面的 [1] 选项编译 lib1,则会在 lib1 上发生段错误,如果使用上面的选项 [2] 编译,则会在 lib2 上发生异常.
更新 2
该问题是由于库之间的全局命名空间冲突造成的。由于 thrift 使用 IDL 机制来生成源文件,两个库(不知何故)为它们的 IDL 定义定义了相同的命名空间,因此观察到了这种行为。接受下面的答案是正确的,因为它间接解决了这个问题。
谢谢你。

最佳答案

这两个库中是否有可能存在一个符号(同名)?
链接器将使用哪一个来解决此类符号的使用取决于顺序(不确定我在哪里阅读过此内容)。
(提示:这只是猜测)
所以让我们假设 lib1 定义了这个函数:

void foo( int, char* );
lib2 定义:
void foo( int );
在某处我们有这样的电话:
foo( 42 );
现在如果链接器找到 lib1 的定义,这个 foo 很可能会得到有趣的垃圾作为它的第二个参数。
更新(对问题更新的 react )
用我们的洞察力很难做出准确的陈述。所以我只能指出一些猜测,希望对你有所帮助。很抱歉我在这里的不准确。但我不知道我还能如何继续:
猜一猜 :
更新说:“如果使用上面的 [1] 选项编译 lib1,则会在 lib1 上发生段错误,如果使用选项 [2] 编译,则会在 lib2 上发生异常”
lib1 中的 ABI 不兼容异常处理?像 this ?
猜2 (或者我应该将其命名为“故事”):
我们的代码继承(并实现)了一个在 thrift 头文件中声明的抽象类。然后这个 impl 被传递给 lib1/lib2(通过我们的冲突符号),它们执行对这个 impl 的调用。但是 lib1 在编译期间使用了不同的 thrift 头文件(或者使用了条件编译,或者使用了另一个版本的 thrift)。

关于c++ - Linux gcc 链接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64035131/

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