Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ two libraries depend on same lib but different versions?

If i have libs A, B and C in C++ using GCC compiler. Lib A and B both depend on C but on different versions of it. Can i then use A and B together in another program? or will the different versions required of C by A and B conflict? And how do i resolve this and can i?

like image 700
CodeMonkey Avatar asked Aug 31 '25 21:08

CodeMonkey


2 Answers

I'm assuming that you're linking dynamically. If both A and B completely encapsulate their respective versions of C then it might be possible to do this. You might have to make sure that the different versions of C are named differently (i.e. libMyC.1.so and libMyC.2.so) to avoid confusion when they are loaded at runtime.

You could also investigate statically building A and B to avoid the possiblility of runtime load confusion.

Simplest way to find out is simply to try it. It shouldn't take to long to determine if it'll work or not.

Lastly, of course, by far the easiest solution, and best from a maintenance perspective is to bring A, or B, up to the level of the other so that they both use the same version of C. This is better in so many ways and I strongly urge you to do that rather than to try working around a real problem.

like image 53
Component 10 Avatar answered Sep 03 '25 21:09

Component 10


Dynamic libraries don't do strong version checking which means that if the entry points that A uses in C haven't changed then it will still be able to use a later version of C. That being said, often Linux distros use a symbol link filesystem method of providing version support. This means that if an executable is designed only to work with 1.2.2 then it can be specifically linked to find /usr/lib/mylib-1.2.2.

Mostly programs are linked to find the general case, eg. /usr/lib/mylib and this will be symbolically linked to the version which is on the machine. E.g. /usr/lib/mylib -> /usr/lib/mylib-1.2.2. Providing you don't link to a specific version and the actuall interfaces don't change, forward compatibility shouldn't be a problem.

If you want to check whether libraries A and B are bound to a specifically named version of C, you can use the ldd command on them to check the dll search path.

like image 43
Benj Avatar answered Sep 03 '25 21:09

Benj