Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 链接到另一个共享对象的共享对象_C - Fatal编程技术网

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

C 链接到另一个共享对象的共享对象,c,C,我在理解下面的代码如何工作时遇到了一些问题。 我有三份档案 Shared.c #include "shared.h" void foo1 (void) { printf("Test2"); } void foo2 (void) { printf ("Test1"); } //#include "shared.h" #include "shared2.h" void shared2 (void){ foo2(); } #include <stdio.h&g

我在理解下面的代码如何工作时遇到了一些问题。 我有三份档案

Shared.c

#include "shared.h"

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

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


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


int main (void){
    foo2();
}
#include <stdio.h>
#include "shared.h"


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

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


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

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


int main (void){
    shared2();
}
Shared.h

#include <stdio.h>

extern void foo2 (void);
extern void foo1 (void);
#include <stdio.h>
#include "shared.h"

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

extern void shared2 (void);
Shared2.h

#include <stdio.h>

extern void foo2 (void);
extern void foo1 (void);
#include <stdio.h>
#include "shared.h"

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

extern void shared2 (void);
由于这个错误

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中注释同一行,上述代码就可以工作

  • 为什么会出现这种错误
  • 如果我删除错误并尝试编译test.c

    gcc -L/MyPath/ -Wall test.c -o test -lshared2 -lshared
    
    只有在包含libshared.so的情况下,编译才有效

  • 但是libshared.so还没有包含在libshared2.so中吗
  • 编辑

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

    Shared.c

    #include "shared.h"
    
    void foo1 (void) {
        printf("Test2");
    }
    
    void foo2 (void) {
        printf ("Test1");
    }
    
    //#include "shared.h"
    #include "shared2.h"
    
    
    void shared2 (void){
        foo2();
    }
    
    #include <stdio.h>
    #include "shared2.h"
    
    
    int main (void){
        foo2();
    }
    
    #include <stdio.h>
    #include "shared.h"
    
    
    void foo1 (void) {
        printf("Test1");
    }
    
    void foo2 (void) {
        printf ("Test2");
    }
    
    #include "shared.h"
    #include "shared2.h"
    
    
    void shared2 (void){
        foo2();
    }
    
    #include "shared2.h"
    
    void shared2 (void){
            foo2();
        }
    
    #include "shared2.h"
    
    
    int main (void){
        shared2();
    }
    
    Shared2.c

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

    #include <stdio.h>
    
    extern void foo2 (void);
    extern void foo1 (void);
    
    #include <stdio.h>
    #include "shared.h"
    
    extern void shared2 (void);
    
    extern void foo1 (void);
    extern void foo2 (void);
    
    extern void shared2 (void);
    
    #include "shared.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
    
    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.cShared2.h

    #include <stdio.h>
    
    extern void foo2 (void);
    extern void foo1 (void);
    
    #include <stdio.h>
    #include "shared.h"
    
    extern void shared2 (void);
    
    extern void foo1 (void);
    extern void foo2 (void);
    
    extern void shared2 (void);
    
    #include "shared.h"
    
    extern void shared2 (void);
    
    Shared2.c

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

    #include <stdio.h>
    
    extern void foo2 (void);
    extern void foo1 (void);
    
    #include <stdio.h>
    #include "shared.h"
    
    extern void shared2 (void);
    
    extern void foo1 (void);
    extern void foo2 (void);
    
    extern void shared2 (void);
    
    #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.so
    libshared2.so
    之后,我修改了test.c

    #include "shared.h"
    
    void foo1 (void) {
        printf("Test2");
    }
    
    void foo2 (void) {
        printf ("Test1");
    }
    
    //#include "shared.h"
    #include "shared2.h"
    
    
    void shared2 (void){
        foo2();
    }
    
    #include <stdio.h>
    #include "shared2.h"
    
    
    int main (void){
        foo2();
    }
    
    #include <stdio.h>
    #include "shared.h"
    
    
    void foo1 (void) {
        printf("Test1");
    }
    
    void foo2 (void) {
        printf ("Test2");
    }
    
    #include "shared.h"
    #include "shared2.h"
    
    
    void shared2 (void){
        foo2();
    }
    
    #include "shared2.h"
    
    void shared2 (void){
            foo2();
        }
    
    #include "shared2.h"
    
    
    int main (void){
        shared2();
    }
    
    test.c

    #include "shared.h"
    
    void foo1 (void) {
        printf("Test2");
    }
    
    void foo2 (void) {
        printf ("Test1");
    }
    
    //#include "shared.h"
    #include "shared2.h"
    
    
    void shared2 (void){
        foo2();
    }
    
    #include <stdio.h>
    #include "shared2.h"
    
    
    int main (void){
        foo2();
    }
    
    #include <stdio.h>
    #include "shared.h"
    
    
    void foo1 (void) {
        printf("Test1");
    }
    
    void foo2 (void) {
        printf ("Test2");
    }
    
    #include "shared.h"
    #include "shared2.h"
    
    
    void shared2 (void){
        foo2();
    }
    
    #include "shared2.h"
    
    void shared2 (void){
            foo2();
        }
    
    #include "shared2.h"
    
    
    int main (void){
        shared2();
    }
    
    如果我尝试用下面的命令编译

    gcc -L/MyPath/ -Wall -Werror test.c -o test -lshared2 
    
    我获得了一个未定义的引用错误,因为gcc无法找到在Shared2.c中调用的
    foo2()
    。为什么会出现这种错误?如果我使用的是共享对象,为什么它需要引用

  • 您可以通过将“shared.h”包含在“shared2.c”中来删除此错误
  • libshared2.so不包括您在“测试”程序中使用的
    foo2
    函数的定义,这就是为什么您需要在编译时添加libshared.so
  • 您的“测试”程序实际上没有使用“libshared2.so”,只使用了“libshared.so”中的
    foo2
    。这里不需要
    -lshared2

  • 您可以通过将“shared.h”包含在“shared2.c”中来删除此错误
  • libshared2.so不包括您在“测试”程序中使用的
    foo2
    函数的定义,这就是为什么您需要在编译时添加libshared.so

  • 您的“测试”程序实际上没有使用“libshared2.so”,只使用了“libshared.so”中的
    foo2
    。这里不需要
    -lshared2

    1。我所做的:我已经将“shared.h”加入到“shared2.c”中,并且它是有效的。我不知道如果我试图编译上面发布的代码为什么它不起作用。你说得对,但是libshared.so是由libshared2链接的。所以:在
    test.c
    文件编译期间,我为什么要编写
    -lshared
    。这是因为您在“shared2.c”中使用了
    foo2
    ,但您没有在任何地方声明它。“shared.h”包含该声明。2.我没有正确阅读问题-我将更新答案。1。我所做的:我已经将“shared.h”加入到“shared2.c”中,并且它是有效的。我不知道如果我试图编译上面发布的代码为什么它不起作用。你说得对,但是libshared.so是由libshared2链接的。所以:在
    test.c
    文件编译期间,我为什么要编写
    -lshared
    。这是因为您在“shared2.c”中使用了
    foo2
    ,但您没有在任何地方声明它。“shared.h”包含该声明。2.我没有正确阅读问题-我将更新答案。请注意,
    shared.h
    shared2.h
    都不应包含
    ,因为函数声明不依赖于
    中定义的任何类型。此外,尚不清楚
    shared2.h
    是否应包括
    shared.h
    。如果人们不能调用
    shared2()
    ,而在作用域中没有
    foo1()
    foo2()
    中的一个或两个,那么嵌套include是合理的。如果人们可以调用
    shared2()
    ,而不知道或不关心
    foo1()
    foo2()
    ,那么不要嵌套include。请注意
    shared.h
    shared2.h
    都不应该包含
    ,因为函数声明不依赖于
    中定义的任何类型。此外,尚不清楚
    shared2.h
    是否应包括
    shared.h
    。如果人们不能调用
    shared2()
    ,而在作用域中没有
    foo1()
    foo2()
    中的一个或两个,那么嵌套include是合理的。如果人们可以调用
    shared2()
    ,而不知道或不关心
    foo1()
    foo2()
    ,那么不要嵌套包含。