我的情况与以下情况非常相似。有libA.so
取决于一些编译时标志表现出略微不同的行为(它是一个外部lib,我无法修改源)。然后,我libB.so
取决于libA.so
(使用-DVALUE=1
编译),在我的可执行文件中,我依赖于libB.so
以及libA.so
},但使用-DVALUE=0
编译。但是,一旦我启动它,ld会使用libA.so
个版本之一解析所有符号,因此我的可执行文件和libB.so
都使用相同的函数。
有没有办法指定我只想使用其依赖项加载解析libB.so
的未定义符号?我在构建-Wl,-Bgroup
时尝试使用libB.so
标记,但它没有改变任何内容。我知道有dlmopen
可以在新的命名空间中加载库,但是我想在启动时自动加载它。
我附加了一组重现行为的文件:
libA.so:
#include <stdio.h>
#define _STR(x) #x
#define STR(x) _STR(x)
#ifndef VALUE
#define VALUE default
#endif
void func2() {
printf(STR(VALUE) "\n");
}
void func() {
func2();
}
libB.so:
#include <stdio.h>
extern void func(void);
void b_func() {
func();
}
可执行:
#include <stdio.h>
extern void b_func(void);
extern void func(void);
int main() {
func(); // should print "default"
b_func(); // should print "other"
}
构建命令:
gcc -fPIC -shared A.c -o libA.so
gcc -fPIC -shared -DVALUE=other A.c -o libA2.so
gcc -fPIC -shared B.c -L. -lA2 -o libB.so
gcc main.c -L. -lA -lB -o main
奇怪的是,它在OS X上运行良好。