C 链接到另一个共享对象的共享对象
我在理解下面的代码如何工作时遇到了一些问题。 我有三份档案 Shared.cC 链接到另一个共享对象的共享对象,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
#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中注释同一行,上述代码就可以工作
gcc -L/MyPath/ -Wall test.c -o test -lshared2 -lshared
只有在包含libshared.so的情况下,编译才有效
#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.c和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
#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()
。为什么会出现这种错误?如果我使用的是共享对象,为什么它需要引用
foo2
函数的定义,这就是为什么您需要在编译时添加libshared.sofoo2
。这里不需要-lshared2
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()
,那么不要嵌套包含。