链接到另一个共享对象的共享对象

时间:2017-10-09 21:54:48

标签: c

我有一些问题需要了解以下代码的工作原理。 我有三个文件

Shared.c

#include "shared.h"

void foo1 (void) {
    printf("Test2");
}

void foo2 (void) {
    printf ("Test1");
}

Shared.h

#include <stdio.h>

extern void foo2 (void);
extern void foo1 (void);

Shared2.c

//#include "shared.h"
#include "shared2.h"


void shared2 (void){
    foo2();
}

Shared2.h

#include <stdio.h>
#include "shared.h"

extern void shared2 (void);

test.c的

#include <stdio.h>
#include "shared2.h"


int main (void){
    foo2();
}

我想创建一个链接shared2.so的二进制测试,它依赖于shared.so 上述代码不适用于以下命令

gcc -c -Wall -Werror -fPIC -o shared.o shared.c 
gcc -shared -o libshared.so shared.o -lc
gcc -c -Wall -Werror -fPIC -o shared2.o shared2.c
gcc -shared -o libshared2.so shared2.o -lc

由于此错误

shared2.c: In function ‘shared2’:
shared2.c:7:2: warning: implicit declaration of function ‘foo2’; did you mean ‘feof’? [-Wimplicit-function-declaration]
  foo2();
  ^~~~
  feof

但是如果我删除Shared2.c中的注释并且我在Shared2.h中注释相同的行,则上面的代码有效。

  1. 为什么会出现这个错误?
  2. 如果我删除错误,我尝试编译test.c

    gcc -L/MyPath/ -Wall test.c -o test -lshared2 -lshared
    

    仅当我包含libshared.so时,编译才有效。

    1. 但是libshared.so还没有包含在libshared2.so?
    2. 修改

      根据您的建议,我已经以这种方式更改了文件

      Shared.c

      #include <stdio.h>
      #include "shared.h"
      
      
      void foo1 (void) {
          printf("Test1");
      }
      
      void foo2 (void) {
          printf ("Test2");
      }
      

      Shared.h

      extern void foo1 (void);
      extern void foo2 (void);
      

      Shared2.c

      #include "shared.h"
      #include "shared2.h"
      
      
      void shared2 (void){
          foo2();
      }
      

      Shared2.h

      extern void shared2 (void);
      

      使用以下命令

      gcc -c -Wall -Werror -fPIC -o shared.o shared.c 
      gcc -shared -o libshared.so shared.o -lc
      gcc -c -Wall -Werror -fPIC -o shared2.o shared2.c
      gcc -shared -o libshared2.so shared2.o -lc
      

      编译时没有错误。 相反,如果我在 Shared2.c Shared2.h

      中进行以下更改

      Shared2.c

      #include "shared2.h"
      
      void shared2 (void){
              foo2();
          }
      

      Shared2.h

      #include "shared.h"
      
      extern void shared2 (void);
      

      我收到错误,我不明白为什么

      shared2.c: In function ‘shared2’:
      shared2.c:7:2: error: implicit declaration of function ‘foo2’; did you mean ‘feof’? [-Werror=implicit-function-declaration]
        foo2();
        ^~~~
        feof
      

      在两种情况下,预处理器输出(替换#include "shared.h"之后)应该相同吗?为什么?

      继续我的测试,在编译libshared.solibshared2.so之后,我修改了我的 test.c

      test.c的

      #include "shared2.h"
      
      
      int main (void){
          shared2();
      }
      

      如果我尝试使用followng命令编译

      gcc -L/MyPath/ -Wall -Werror test.c -o test -lshared2 
      

      我获得了一个未定义的引用错误,因为gcc无法找到 Shared2.c 中调用的foo2()。为什么这个错误?如果我使用共享对象,为什么需要引用?

1 个答案:

答案 0 :(得分:0)

  1. 您可以通过将“shared.h”包含在“shared2.c”中来删除此错误。
  2. libshared2.so不包含您在“test”程序中使用的foo2函数的定义,这就是您需要在编译时添加libshared.so的原因。
  3. 您的“测试”程序实际上并未使用“libshared2.so”,而只使用“libshared.so”中的foo2。您在此处不需要-lshared2