Linking g++ 4.8 to libstdc++

后端 未结 3 2050
长发绾君心
长发绾君心 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: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).

提交回复
热议问题