我有一个用C编写的Linux程序,带有静态链接库。 library_x的版本是例如1.0.1。
当我在PC上调用我的程序时,我的library_x版本1.0.1已加载,它的工作方式与预期的一样。
但是当在PC上时,调用程序已经“加载”了另一个版本的library_x,例如1.0.0,我的library_x 1.0.1不再加载了。在堆栈中,我可以看到我的代码调用被定向到library_x 1.0.0。
这可以避免吗?如何强制我的代码使用我的library_x 1.0.1?
答案 0 :(得分:1)
我无法重现你的问题。我做的很简单,完成没有任何特别之处。为了重现,我在下面提供了所有细节。
如果您需要一些基本信息,请查看此页面: http://www.kaizou.org/2015/01/linux-libraries/
完整示例:
生成文件:
all: go1 go2
mylib.so.1: mylib.so.1.1.1
ln -s mylib.so.1.1.1 mylib.so.1
mylib.so.2: mylib.so.2.2.2
ln -s mylib.so.2.2.2 mylib.so.2
go1: main.cpp mylib.so.1.1.1 mylib.so.1
$(CXX) -O3 mylib.so.1.1.1 -Wall -pedantic -Wextra main.cpp -g -o go1
go2: main.cpp mylib.so.2.2.2 mylib.so.2
$(CXX) -O3 mylib.so.2.2.2 -Wall -pedantic -Wextra main.cpp -g -o go2
mylib.so.1.1.1: lib1.cpp
g++ -fPIC -Wl,-soname,mylib.so.1 -o mylib.so.1.1.1 -shared lib1.cpp
mylib.so.2.2.2: lib2.cpp
g++ -fPIC -Wl,-soname,mylib.so.2 -o mylib.so.2.2.2 -shared lib2.cpp
clean:
rm -f go*
rm -f main.o f1.o f2.o
rm -f mylib*.so.*
main.cpp中:
#include <unistd.h>
void f1();
int main()
{
sleep(2);
f1();
}
lib1.cpp:
#include <iostream>
void f1() { std::cout << "Version 1 " << std::endl; }
lib2.cpp:
#include <iostream>
void f1() { std::cout << "Version 2 " << std::endl; }
您可以通过以下方式致电:
export LD_LIBRARY_PATH =。
go1&amp; GO2
正如您所看到的,两个版本并行运行并使用不同版本的共享库。所以我根本无法重现你的问题!