感謝您的所有回覆。我有一個似乎正在工作的解決方案。 下面是一個例子的詳細問題。
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。所以並運行主:
$ 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中欄的版本叫做,沒有連接到共享庫的版本。
在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的共享共享庫中的庫調用欄和main.c中的主要調用欄。我不認爲這種行爲是直觀的,使用dlopen/dlsym更多的工作,但它確實解決了我的問題。
再次感謝您的評論。
你可以讓你的應用動態鏈接到VENDOR1嗎? – 2010-07-12 23:31:32
不以任何方式與語言無關。這對於編譯器鏈接器和操作系統來說非常具體,它們是如何一起工作的。最簡單的方法是通過電子郵件向供應商和他們如何解決這個問題。 – 2010-07-12 23:31:43
我們目前的想法是,至少在linux上,使用libbar.so上的dlopen()和RTLD_DEEPBIND標誌。另一種可能性是將libfoo.a的應用程序分離到共享庫中,libbaz.so將libfoo.a封裝起來,然後將應用程序dlopen libbaz.so和libbar.so與RTLD_LOCAL分離,我們認爲這可能會保留所有重複的符號在內部。這可能適用於Linux,但我們需要它,因此也適用於Solaris,AIX和HPUX。 – YerBlues 2010-07-13 00:05:42