gpt4 book ai didi

ubuntu - 在 Ubuntu 系统中链接动态库时 undefined reference

转载 作者:行者123 更新时间:2023-12-04 18:36:42 26 4
gpt4 key购买 nike

我在我的 Ubuntu 系统中编写了这样的代码:

我的.h

#include <stdio.h>
int a;
int set(void);

库文件
#include "my.h"
int set(void) {
a = 100;
return 0;
}

主程序
#include "my.h"

int main(void){
set();
printf("a = %d\n", a);
return 0;
}

然后我使用以下命令来构建它们:
gcc -shared -fPIC -o libmy.so -I. lib.c

gcc -L. -lmy -I. -o test main.c

当我构建测试时,我得到错误信息:
main.c:(.text+0x5):undefined reference to 'set'
collect2: error: ld returned 1 exit status

but when i use the same code run in Fedora23 and Fedora24, it works well.



所以我想知道为什么会发生这种情况? Ubuntu系统有什么限制吗?

最佳答案

您已经违反了链接约定之间的差异
Fedora 的 GCC 构建和 Debian/Ubuntu 的 GCC 构建。

当您调用 gcc要执行 C 可执行文件的链接,它会依次调用系统链接器ld ,将您的命令行链接选项传递给它并默默地添加到
它们有大量不变的“样板”链接选项
对于 C 语言链接(类似于 g++ 和 C++ 语言链接)。

这些不变的链接选项由您的发行版决定并配置
进入他们的 GCC 构建。所以它们在发行版中不是一成不变的。

Debian/Ubuntu GCC 默默添加 --as-needed到链接选项
输入文件和库之前的位置。 Fedora 的 GCC 没有。
--as-needed的效果|是使链接器链接成为共享库
仅当该库提供时,它才会在链接序列中找到
链接器已经找到的一个或多个符号的定义
undefined reference (即在早期的目标文件或库中
在链接序列中)。这种行为在任何情况下都适用于静态库。
所以--as-needed使静态和共享的链接规则相似
库 - 这可能被认为对普通用户有帮助。

这种差异是发行版之间的链接策略差异。什么
对你来说意味着在 Ubuntu 上成功链接,你的链接命令行
必须在任何目标文件或其他依赖的库之后提及任何库
在上面。如果你在一个命令中编译和链接,那么你必须
在其对应的目标文件的任何源文件之后提及任何库
取决于那个库。所以在 ubuntu 上,你的问题命令行应该是:

gcc -I. -o test main.c -L. -lmy

成功。这当然也适用于 Fedora。

如果您有兴趣检查链接中的隐藏差异
两个发行版之间的选项,您可以通过添加 -Wl,-v 来显示它们给你的
compile-and-link 命令以获取详细的链接器输出。

关于ubuntu - 在 Ubuntu 系统中链接动态库时 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42113237/

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