源代码如下:
#include <stddef.h>
#include <stdio.h>
#include <pty.h>
int main(void)
{
int iRet;
int iMaster;
int iSlave;
iRet = openpty(&iMaster, &iSlave, NULL, NULL, NULL);
if (0 != iRet)
{
printf("failed to open pty.\n");
return -1;
}
return 0;
}
编译报链接错误:
gcc -Wall -lutil -o test test.c
/usr/bin/ld: /tmp/ccNbau8Y.o: in function `main':
test.c:(.text+0x37): undefined reference to `openpty'
collect2: error: ld returned 1 exit status
同样代码在centos 7.1编译通过,gcc glibc版本使用更高的,也可以编译通过;
手动指定ltuil的位置,以及手动重编glibc库,再重新指定,也无法编译通过,各位谁有经验处理过类似问题的,请不吝赐教,谢谢~
系统版本:
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.4 LTS
Release: 20.04
Codename: focal
ubuntu20.04使用openpty时链接lutil库失败
- shzb89
- 帖子: 4
- 注册时间: 2011-11-25 11:20
- 系统: ubuntu9.10&10.04
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
Re: ubuntu20.04使用openpty时链接lutil库失败
其实就是个参数顺序的问题。好像是从gcc 4.7开始,链接时搜寻符号的时候严格参照参数的顺序,所以必须将被依赖的库放到目标之后
gcc -Wall -o test test.c -lutil
gcc -Wall -o test test.c -lutil
- shzb89
- 帖子: 4
- 注册时间: 2011-11-25 11:20
- 系统: ubuntu9.10&10.04
Re: ubuntu20.04使用openpty时链接lutil库失败
嗯,后面发现了。不过不是4.7吧?CentOS 7.1的这个gcc版本是4.8.3。
Ubuntu的这个是9.4版本,我在其他服务器上,用更高版本(10.3)的,好像又没这个问题。
Ubuntu的这个是9.4版本,我在其他服务器上,用更高版本(10.3)的,好像又没这个问题。
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
Re: ubuntu20.04使用openpty时链接lutil库失败
十多年前的事记不太清了,刚查了一下,是从ubuntu11.10上的gcc 4.6.1开始,默认启用了链接参数-Wl,--as-needed https://wiki.ubuntu.com/ToolChain/Compi ... -as-needed ,所以需要严格控制链接顺序
至于为什么更高版本的不会报错,这是因为在更高版本所在的系统上,libutil.a实际上是个空文件,-lutil这个参数并不起作用,删掉都行。openpty这些符号实际上是由libc库提供的,而在链接时-lc参数是放在test.c生成的对象文件之后的,可用gcc --verbose -o test test.c查看