我创建了一个共享库,如下所示:
gcc -c output.c
gcc -shared -fPIC -o liboutput.so output.o
当output.c如下所示时,它可以工作。
//#include "output.h"
#include <stdio.h>
int output(const char* st) {
return 1+2;
}
但是,当output.c改变如下时,会发生错误。
//#include "output.h"
#include <stdio.h>
int output(const char* st) {
printf("%s\n", st);
return 1+2;
}
这是错误消息:
/ usr / bin / ld:output.o:重定位R_X86_64_PC32对未定义的符号`puts @@ GLIBC_2.2.5&#39;制作共享对象时不能使用;用-fPIC重新编译 / usr / bin / ld:最后的链结失败:错误的值 collect2:错误:ld返回1退出状态
我想知道为什么以及如何处理它。提前谢谢。
答案 0 :(得分:2)
您需要将output.c
编译为与位置无关的代码。
gcc -c -fPIC output.c
在第一个版本中,您没有调用任何库函数。但在第二个printf
被召唤。通常,如果您打算稍后构建共享库,请使用-fPIC
编译所有源。