1

[SOLVED] created symlinks from /usr/lib/lib/* to /usr/lib*

[UPDATE 3] NEW VERSION:

Ok, I think I fixed something

use find / -name "libboost_system.*" outout was

/usr/include/boost/lib/libboost_system.so
/usr/include/boost/lib/libboost_system.a
/usr/include/boost/lib/libboost_system.so.1.46.1
/usr/lib/lib/libboost_system.so
/usr/lib/lib/libboost_system.a
/usr/lib/lib/libboost_system.so.1.46.1
/usr/local/include/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/link-static/threading-multi/libboost_system.a
/usr/local/include/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/threading-multi/libboost_system.so.1.46.1
/usr/local/lib/libboost_system.so
/usr/local/lib/libboost_system.a
/usr/local/lib/libboost_system.so.1.46.1
/root/tmp/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/link-static/threading-multi/libboost_system.a
/root/tmp/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/threading-multi/libboost_system.so.1.46.1

why are these files in /usr/lib/lib ? and is it a problem ?

and the ls -l /usr/lib/lib | grep boost_system

ls -l /usr/lib/lib | grep boost_system
-rw-r--r-- 1 root root   21574 2011-05-09 15:15 libboost_system.a
lrwxrwxrwx 1 root root      25 2011-05-09 15:15 libboost_system.so -> libboost_system.so.1.46.1
-rwxr-xr-x 1 root root   20053 2011-05-09 15:15 libboost_system.so.1.46.1

atm my makefile looks like

LIBPATH=-I/usr/local/include/cpp-netlib 
LIBS=$(LIBPATH) -lboost_system  -lboost_filesystem -lboost_thread -lpthread 

LD=g++ -g 
CPP=g++ -c -g $(LIBS)

P=.
OBJ=$(P)/tmp/main.o $(P)/tmp/CLink.o $(P)/tmp/CFetcher.o

main:   $(OBJ); $(LD) $(OBJ) $(LIBS) -o $@


$(P)/tmp/CLink.o:   $(P)/src/CLink.cpp $(P)/include/CLink.h; $(CPP) -c $< -o $@
$(P)/tmp/CFetcher.o:    $(P)/src/CFetcher.cpp $(P)/include/CFetcher.h; $(CPP) -c $< -o $@
$(P)/tmp/main.o:    $(P)/src/main.cpp $(P)/include/CLink.h $(P)/include/CFetcher.h ; $(CPP) -c $< -o $@

all:
    touch $(P)/tmp/*.o;
    touch main;
    rm -f $(P)/tmp/*.o;
    rm -f main;
    make main;

The Compiler output is lie

g++ -c -g -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -c src/main.cpp -o tmp/main.o
g++ -c -g -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -c src/CLink.cpp -o tmp/CLink.o
g++ -c -g -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -c src/CFetcher.cpp -o tmp/CFetcher.o
g++ -g  ./tmp/main.o ./tmp/CLink.o ./tmp/CFetcher.o -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -o main

So for me all looks nice but when i try to run the program

./main

./main: error while loading shared libraries: libboost_system.so.1.46.1: cannot open shared object file: No such file or directory

2 Answers 2

2
  1. The -l flags must come after the source files on linker command-line.

    Yes, that means you'll have to split the LD definition to LD and LIBS, put all the -L and -l flags in the later and change the link command to:

    $(LD) $(OBJ) $(LIBS) -o $@

  2. The library (.so (dynamic) or .a (static)) files have to be the same version as the headers. While there are boost 1.46.1 headers installed in /usr/local/include/boost_1_46_1/, the corresponding library files don't seem to be installed at all. The only installed libraries are version 1.40.0 in /usr/lib, so the linker finds those (/usr/lib would be searched by default even if you didn't include the -L/usr/lib flag), but they don't contain the symbols expected by 1.46.1.

    Note that when linking against shared library (using shared libraries is strongly recommended in Linux), the linker looks for the file with .so extension, but that is usually symlink to a file with added version suffix and the linker reads it and records the target name in the binary. That way programs compiled against the .1.40 will continue to work when 1.46 is installed, because the libboost*.so.1.40.0 may (and have to) stay around after the .so is redirected to the 1.46.1 version.

    It should be even possible to install like:

    /usr/local/lib/boost_1_46_1/libboost_system-mt.so -> /usr/local/lib/libboost_system-mt.so.1.46
    /usr/local/lib/libboost_system-mt.so.1.46 -> /usr/local/lib/libboost_system-mt.so.1.46.1
    /usr/local/lib/libboost_system-mt.so.1.46.1
    

    and compile using -L/usr/local/lib/boost_1_46_1, though I currently can't find any package that would do it to confirm this. This way you could have development files for multiple versions installed and switch between them using explicit -I and -L flags while dynamic linker would still find the runtime files, for which it only looks in /usr/local/lib, /usr/lib and /lib (it can be configured in /etc/ld.so.conf, but that's the default).

10
  • another common name for $(LIBS) would be $(LDFLAGS)
    – sehe
    Commented May 9, 2011 at 10:21
  • hey thx for the answer, i hope i understand what you mean. just look to the main post. is it correct ? because the make failed... greetz
    – Roby
    Commented May 9, 2011 at 12:35
  • @Roby: It is what I meant. I believe you want either the -mt variants or the others, not both and you may need to change the order of the libraries.
    – Jan Hudec
    Commented May 9, 2011 at 12:43
  • @Roby: Are you sure you have headers and libraries from the same version of boost? You use the -L flags with paths where includes are, but the libraries are elsewhere (/usr/local/lib/boost_1_46_1 maybe?), so libraries from /usr/lib are being used and if they are different version, it won't link.
    – Jan Hudec
    Commented May 9, 2011 at 12:49
  • @Roby: I think the -L flags are incorrect. They shouldn't be the same as the -I ones. Can you `find /lib /usr/lib /usr/local -name 'libboost_system-mt.*', please?
    – Jan Hudec
    Commented May 9, 2011 at 12:52
2

Execute your application with strace. This will show the location were you app is looking for your boost libs. In my case an app was looking in /usr/lib/x86_64-linux-gnu for boost libs where the actual location was /usr/lib/lib. A simple export statement adding the paths for the boost shared libs in my case LD_LIBRARY_PATH=/usr/lib/lib worked a treat.

output from strace

open("/usr/lib/x86_64-linux-gnu/libboost_system.so.1.46.1", O_RDONLY) = -1 ENOENT (No such file or directory)
exit_group(127)                         = ?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.