2016-12-22 12 views
0

У меня есть следующие программы:C++ - G ++ ссылки от неправильного stdlibC++

#include <iostream>      

int main()        
{          
    std::cerr << "hejsan" << std::endl; 
} 

компилировать его с помощью следующей команды:

г ++ main.cpp -Wl, -rpath,/приложение/vbuild /RHEL6-x86_64/gcc/6.2.0/lib -std = C++ 11

Идущие возвращается LDD:

ldd a.out 
     linux-vdso.so.1 => (0x00007ffe8f1eb000) 
     libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000032f9e00000) 
     libm.so.6 => /lib64/libm.so.6 (0x00000032f6600000) 
     libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000032f8a00000) 
     libc.so.6 => /lib64/libc.so.6 (0x00000032f5a00000) 
     /lib64/ld-linux-x86-64.so.2 (0x00000032f5600000) 

Как вы можете видеть, что выбирает libstdC++ внутри /usr/lib64/libstdc++.so.6

Установка LD_DEBUG = ЛИЭС показывает следующее:

792127:  find library=libstdc++.so.6 [0]; searching 
792127:  search path=/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/tls/x86_64:/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/tls:/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/x86_64:/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib   (RPATH from file ./a.out) 
792127:  trying file=/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/tls/x86_64/libstdc++.so.6 
792127:  trying file=/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/tls/libstdc++.so.6 
792127:  trying file=/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/x86_64/libstdc++.so.6 
792127:  trying file=/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/libstdc++.so.6 
792127:  search cache=/etc/ld.so.cache 
792127:  trying file=/usr/lib64/libstdc++.so.6 

Это STDLIB я хочу его используйте: try file =/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/libstdC++. so.6, но почему-то похоже, что кеш используется вместо этого. У меня нет корневого доступа и я ничего не могу удалить. Как я могу это решить?

Это проблема, потому что я использую это против более сложного кода, который требует более высокой версии GLIBCXX, чем предоставляет stdlib внутри usr/lib64.

Любая помощь приветствуется

+1

Вам также необходимо связаться с нужной библиотекой. Попробуйте что-то вроде 'g ++ main.cpp /app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/libstdc++.so ...' –

+0

Вы уверены, что используете правильный компилятор? Что говорит 'g ++ -version'? –

+0

И какой результат вы получаете, когда пытаетесь запустить 'ls -l /app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/libstdC++. So.6' –

ответ

0

Я думаю, что это может быть по существу дублирует мой вопрос: Forcing or preventing use of a particular minor version of libstdc++

Этот вопрос включает в себя способ установки программ, собранных с более поздней версией GCC, которая работает, но может быть хак. Вопрос ищет лучшую альтернативу, и у меня нет принятого ответа, хотя я думаю, что я близок к одному.

Его явно не упоминается в вопросе, но у меня есть более новые версии gcc, установленные в/opt/gcc /. Я поставил свой путь, чтобы использовать их следующим образом:

PREFIX=/opt/gcc6.3.0 
export C_INCLUDE_PATH=$PREFIX/include 
export CPLUS_INCLUDE_PATH=$PREFIX/include 
export LD_LIBRARY_PATH=$PREFIX/lib:$PREFIX/lib64:$LD_LIBRARY_PATH 
export PATH=$PREFIX/bin:$PATH 

При настройке с CMake может быть полезно использовать:

CC=`which gcc` CXX=`which c++` cmake ... 

для обеспечения CMake не находит саму систему GCC.