C 使用特定版本的库

C 使用特定版本的库,c,linux,C,Linux,我有一个用C编写的Linux程序,带有一个静态链接库。库_x的版本为1.0.1 当在PC上仅调用我的程序时,我的library_x版本1.0.1将加载,并且它的工作方式与预期的一样 但是,当在PC上调用程序已经“加载”了另一个版本的库_x时,例如1.0.0,我的库_x1.0.1将不再加载。在堆栈中,我可以看到我的代码调用被定向到库_x1.0.0 这能避免吗?如何强制我的代码使用我的库\u x 1.0.1?我无法重现您的问题。我做的很简单,没有任何特色菜。为了重现,我把所有细节都放在下面 如果您需

我有一个用C编写的Linux程序,带有一个静态链接库。库_x的版本为1.0.1

当在PC上仅调用我的程序时,我的library_x版本1.0.1将加载,并且它的工作方式与预期的一样

但是,当在PC上调用程序已经“加载”了另一个版本的库_x时,例如1.0.0,我的库_x1.0.1将不再加载。在堆栈中,我可以看到我的代码调用被定向到库_x1.0.0


这能避免吗?如何强制我的代码使用我的库\u x 1.0.1?

我无法重现您的问题。我做的很简单,没有任何特色菜。为了重现,我把所有细节都放在下面

如果您需要一些基本信息,请查看本页:

完整示例:

生成文件:

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();
}   
#包括
void f1();
int main()
{   
睡眠(2);
f1();
}   
lib1.cpp:

#include <iostream>
void f1() { std::cout << "Version 1 " << std::endl; }
#包括

void f1(){std::cout如果库是静态链接的,则不应发生这种情况。似乎链接的硬编码库版本(通常它的硬代码也是回退版本,即1.0和1。请向我们展示您是如何编译和链接程序的。要解决您的问题,我们需要知道1。您的库的确切文件名是什么,以及该库位于哪个文件夹中。2.创建可执行文件(并将其链接到库)时运行的确切命令).3.在工作的PC和不工作的PC上运行
ldd./your executable
时得到的输出。4.您的1.0.1版库在未工作的PC上的确切位置,以及1.0.0版库在同一台PC上的位置。请注意,您描述的内容不应在运行时发生k statically你是说动态链接吗?谢谢你的宝贵反馈,让我知道它必须工作。对于示例代码,我也无法复制它。因此我正在检查编译和链接设置以找到根本原因。
#include <iostream>
void f1() { std::cout << "Version 2 " << std::endl; }