【发布时间】:2021-06-09 00:13:16
【问题描述】:
我正在将一个用 C 编写的项目从 CentOS 7(Core)移植到 Ubuntu 20.04.1 LTS(Focal Fossa)系统。该项目严重依赖<cpuset.h> 库,并在CentOS 系统上正确编译和执行。但是,当我尝试在 Ubuntu 系统上使用 cpuset.h 中的函数时,我收到“未定义引用”错误。
以下代码,存储在文件test.c 中,可在 CentOS 上正确编译和运行:
#define _GNU_SOURCE
#include<stdio.h>
#include <cpuset.h>
int main(){
int x = cpuset_version();
printf("cpuset lib version: %d\n",x );
return 0;
}
我如何编译:
gcc -Wall -O2 -std=gnu99 -g -lcpuset test.c -o test
输出:
[xxxx@CentOS]$ ./test
cpuset lib version: 3
但是,当我尝试在 Ubuntu 系统上编译相同的 test.c 文件时,我收到此错误:
xxxx@Ubuntu:$ gcc -Wall -O2 -std=gnu99 -g -lcpuset test.c -o test
/usr/bin/ld: /tmp/ccpxlk4F.o: in function `main':
test.c:8: undefined reference to `cpuset_version'
collect2: error: ld returned 1 exit status
此外,这不仅限于<cpuset.h> 库。我尝试使用<pthread.h> 中的一个简单函数,它也给了我同样的错误。任何人都可以帮助确定为什么我不能在 Ubuntu 系统上使用共享库吗?提前致谢
【问题讨论】:
-
这是您上一个问题的后续问题:stackoverflow.com/questions/66535986/… 但是,它看起来像回归。在上一个问题中,您可以链接到库[并且错误是来自
cpuset_create调用的运行时错误]。现在,您在链接到库时遇到了问题。但是,由于它可以编译,这意味着cpuset.h存在并且可以访问。那么,什么目录呢?对于 pthread,您是否将-lpthread添加为 last 参数。尝试使用find:(例如)find / -xdev -name '*pthread*'[也适用于*cpuset*] -
按命令行的顺序扫描事物。将
-lcpuset作为 last 参数。正如你所拥有的,lib is 被扫描,但没有被拉入,因为它只会在 编译test.c而 没有 之后这样做i> 在扫描-lcpuset时发生。 -
@CraigEstey:没错!所以,Shivam Kundan,使用
gcc -Wall -O2 -std=gnu99 -g test.c -lcpuset -o test。在 Makefile 术语中,$(CC) $(CFLAGS) -c $^编译但不链接,$(CC) $(CFLAGS) $^ $(LDFLAGS) -o $@链接(或编译和链接,就像现在一样)。 -
这在 CentOS 上也会失败。
-
感谢您的帮助,@CraigEstey。解决方案确实是将 -lcpuset 移动到命令的末尾。由于这与我之前的帖子无关,因此我将其标记为已回答。
标签: c linux ubuntu shared-libraries centos7