使用特定版本的库

时间:2018-03-28 12:21:29

标签: c linux

我有一个用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?

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

正如您所看到的,两个版本并行运行并使用不同版本的共享库。所以我根本无法重现你的问题!