当我创建共享库时,会发生错误

时间:2017-05-17 07:32:25

标签: c gcc shared-libraries

我创建了一个共享库,如下所示:

  1. gcc -c output.c
  2. gcc -shared -fPIC -o liboutput.so output.o
  3. 当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退出状态

    我想知道为什么以及如何处理它。提前谢谢。

1 个答案:

答案 0 :(得分:2)

您需要将output.c编译为与位置无关的代码。

gcc -c -fPIC output.c

在第一个版本中,您没有调用任何库函数。但在第二个printf被召唤。通常,如果您打算稍后构建共享库,请使用-fPIC编译所有源。