我有一些问题需要了解以下代码的工作原理。 我有三个文件
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中注释相同的行,则上面的代码有效。
如果我删除错误,我尝试编译test.c
gcc -L/MyPath/ -Wall test.c -o test -lshared2 -lshared
仅当我包含libshared.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.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.so
和libshared2.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()
。为什么这个错误?如果我使用共享对象,为什么需要引用?
答案 0 :(得分:0)
foo2
函数的定义,这就是您需要在编译时添加libshared.so的原因。您的“测试”程序实际上并未使用“libshared2.so”,而只使用“libshared.so”中的foo2
。您在此处不需要-lshared2
。