gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:21:10 26 4
gpt4 key购买 nike

我在理解以下代码的工作原理时遇到了一些问题。我有三个文件

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);

测试.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. 为什么会出现这个错误?

如果我删除错误并尝试编译 test.c

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

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

  1. 但是 libshared.so 还没有包含在 libshared2.so 中吗?

编辑

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

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.cShared2.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

测试.c

#include "shared2.h"


int main (void){
shared2();
}

如果我尝试使用以下命令进行编译

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

我收到一个 undefined reference 错误,因为 gcc 无法找到 Shared2.c 中调用的 foo2()。为什么会出现这个错误?如果我使用的是共享对象,为什么它需要引用?

最佳答案

  1. 您可以通过将“shared.h”包含到“shared2.c”中来消除此错误。
  2. libshared2.so 不包含您在“测试”程序中使用的 foo2 函数的定义,这就是您需要在编译时添加 libshared.so 的原因。

您的“测试”程序实际上并未使用“libshared2.so”,仅使用“libshared.so”中的foo2。这里不需要 -lshared2

关于c - 链接到另一个共享对象的共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46655537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com