Linking g++ 4.8 to libstdc++

后端 未结 3 2032
长发绾君心
长发绾君心 2020-11-28 12:51

I downloaded and built gcc 4.8.1 on my desktop, running 64-bit Ubuntu 12.04. I built it out of source, like the docs recommend, and with the commands

../../g         


        
相关标签:
3条回答
  • 2020-11-28 13:31

    When you link with your own gcc you need to add an extra run-time linker search path(s) with -Wl,-rpath,$(PREFIX)/lib64 so that at run-time it finds the shared libraries corresponding to your gcc.

    I normally create a wrapper named gcc and g++ in the same directory as gcc-4.8 and g++-4.8 which I invoke instead of gcc-4.8 and g++-4.8, as prescribed in Dynamic linker is unable to find GCC libraries:

    #!/bin/bash
    exec ${0}SUFFIX -Wl,-rpath,PREFIX/lib64 "$@"
    

    When installing SUFFIX and PREFIX should be replaced with what was passed to configure:

    cd ${PREFIX}/bin && rm -f gcc g++ c++ gfortran
    sed -e 's#PREFIX#${PREFIX}#g' -e 's#SUFFIX#${SUFFIX}#g' gcc-wrapper.sh > ${PREFIX}/bin/gcc
    chmod +x ${PREFIX}/bin/gcc
    cd ${PREFIX}/bin && ln gcc g++ && ln gcc c++ && ln gcc gfortran
    

    (gcc-wrapper.sh is that bash snippet).


    The above solution does not work with some versions of libtool because g++ -Wl,... -v assumes linking mode and fails with an error.

    A better solution is to use specs file. Once gcc/g++ is built, invoke the following command to make gcc/g++ add -rpath to the linker command line (replace ${PREFIX}/lib64 as necessary):

    g++ -dumpspecs | awk '/^\*link:/ { print; getline; print "-rpath=${PREFIX}/lib64", $0; next } { print }' > $(dirname $(g++ -print-libgcc-file-name))/specs
    
    0 讨论(0)
  • 2020-11-28 13:32

    I just had the same problem when building gcc-4.8.2. I don't have root access on that machine and therefore need to install to my home directory. It took several attempts before I figured out the magic required to get this to work so I will reproduce it here so other people will have an easier time. These are the commands that I used to configure gcc:

    prefix=/user/grc/packages
    
    export LDFLAGS=-Wl,-rpath,$prefix/lib
    export LD_RUN_PATH=$prefix/lib
    export LD_LIBRARY_PATH=$prefix/lib
    
    ../../src/gmp-4.3.2/configure  --prefix=$prefix
    ../../src/mpfr-2.4.2/configure --prefix=$prefix
    ../../src/mpc-0.8.1/configure  --prefix=$prefix --with-mpfr=$prefix --with-gmp=$prefix
    ../../src/gcc-4.8.2/configure  --prefix=$prefix --with-mpfr=$prefix --with-gmp=$prefix --with-mpc=$prefix --enable-languages=c,c++
    

    That got me a working binary but any program I built with that version of g++ wouldn't run correctly unless I built it with the -Wl,-rpath,$prefix/lib64 option. It is possible to get g++ to automatically add that option by providing a specs file. If you run

    strace g++ 2>&1 | grep specs
    

    you can see which directories it checks for a specs file. In my case it was $prefix/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/specs so I ran g++ -dumpspecs to create a new specs file:

    cd $prefix/lib/gcc/x86_64-unknown-linux-gnu/4.8.2
    $prefix/bin/g++ -dumpspecs > xx
    mv xx specs
    

    and then edited that file to provide the -rpath option. Search for the lines like this:

    *link_libgcc:
    %D
    

    and edit to add the rpath option:

    *link_libgcc:
    %D -rpath /user/grc/packages/lib/%M
    

    The %M expands to either ../lib or ../lib64 depending on whether you are building a 32-bit or a 64-bit executable.

    Note that when I tried this same trick on an older gcc-4.7 build it didn't work because it didn't expand the %M. For older versions you can remove the %M and just hardcode lib or lib64 but that is only a viable solution if you only ever build 32-bit executables (with lib) or only ever build 64-bit executables (with lib64).

    0 讨论(0)
  • 2020-11-28 13:39

    gcc -print-search-dirs will tell you where your compiler is looking for runtime libraries, etc. You can override this with the -B<prefix> option.

    0 讨论(0)
提交回复
热议问题