谢谢所有的回复。我有一个解决方案似乎可以工作。
这是具体问题及示例。
在main.c中我们有:
#include <stdio.h>
extern int foo();
int bar()
{
printf("bar in main.c called\n");
return 0;
}
int main()
{
printf("result from foo is %d\n", foo());
printf("result from bar is %d\n", bar());
}
在 foo.c 文件中,我们有:
extern int bar();
int foo()
{
int x = bar();
return x;
}
我们在bar.c中有以下代码:
#include <stdio.h>
int bar()
{
printf("bar in bar.c called\n");
return 2;
}
编译 bar.c 和 foo.c:
$ gcc -fPIC -c bar.c
$ gcc -fPIC -c foo.c
将bar.o添加到静态库中:
$ ar r libbar.a bar.o
现在,使用foo.o创建一个共享库,并与静态库libbar.a链接。
$ gcc -shared -o libfoo.so foo.o -L. -lbar
编译 main.c 并链接共享库 libfoo.so
$ gcc -o main main.c -L. -lfoo
设置LD_LIBRARY_PATH以查找libfoo.so并运行main:
$ setenv LD_LIBRARY_PATH `pwd`
$ ./main
bar in main.c called
result from foo is 0
bar in main.c called
result from bar is 0
请注意,main.c中的bar版本被调用,而不是链接到共享库中的版本。
在main2.c中我们有:
#include <stdio.h>
#include <dlfcn.h>
int bar()
{
printf("bar in main2.c called\n");
return 0;
}
int main()
{
int x;
int (*foo)();
void *handle = dlopen("libfoo.so", RTLD_GLOBAL|RTLD_LAZY);
foo = dlsym(handle, "foo");
printf("result from foo is %d\n", foo());
printf("result from bar is %d\n", bar());
}
编译并运行main2.c文件(注意我们不需要显式地链接libfoo.so):
$ gcc -o main2 main2.c -ldl
$ ./main2
bar in bar.c called
result from foo is 2
bar in main2.c called
result from bar is 0
现在共享库中的foo调用了共享库中的bar,而主程序在main.c中调用了bar。
我认为这种行为并不直观,使用dlopen / dlsym 需要更多的工作,但它解决了我的问题。
再次感谢您的意见。