Фон: По умолчанию gcc
версия в Debian Jessie 4.9.2
не поддерживает CXX_STANDARD 14
.
[dk@jessie /home/dk/qib]$ /usr/bin/gcc --version
gcc (Debian 4.9.2-10+deb8u1) 4.9.2
My CMakeLists.txt указывает CXX_STANDARD 14
и CXX_STANDARD_REQUIRED ON
.
Итак, я собрал 8.2.0
из источника и установил в /usr/local/bin/
папку:
[dk@jessie /home/dk/qib]$ /usr/local/bin/gcc --version
gcc (GCC) 8.2.0
и указал cmake
на новый компилятор, поддерживающий этот стандарт:
[dk@jessie /home/dk/qib/build]$ cmake -DCMAKE_C_COMPILER=/usr/local/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ -DBUILD_x64=ON ..
Проблема: Затем скомпилированный двоичный файл указывает на старый libstdc++.so.6
, и я получаю эту ошибку:
[dk@jessie /home/dk/qib/build]$ ldd ../bin/qib.0.0.1.so
../bin/qib.0.0.1.so: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ../bin/qib.0.0.1.so)
../bin/qib.0.0.1.so: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ../bin/qib.0.0.1.so)
linux-vdso.so.1 (0x00007ffd43ee9000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff532750000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff53244f000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff532239000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff531e8e000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff532cdc000)
Одно решение:
Один из способов указать компилятору / компоновщику на более новую версию, используя cmake
, заключается в следующем (обратите внимание, что наш двоичный файл теперь ссылается на более новую libstdc++.so.6.so
):
[dk@jessie /home/dk/qib/build]$ cmake -E env CXXFLAGS="-Wl,-rpath,/usr/local/lib64/" cmake -DBUILD_x64=ON -DCMAKE_C_COMPILER=/usr/local/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ ..
...
[dk@jessie /home/dk/qib]$ ldd bin/qib.0.0.1.so
linux-vdso.so.1 (0x00007ffd3533b000)
libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007f54340e0000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5433ddf000)
libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007f5433bc8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f543381d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f54346e4000)
Вопрос : Существуют ли лучшие, переносимые, распространяемые способы автоматизации сборки, если предположить (в идеале), что никто не может прикоснуться к оригинальному CMakeLists.txt
(это восходящий поток) или использовать LD_LIBRARY_PATH
( не желательно все равно )?
Мой черновой build.sh
скрипт, в качестве входных данных для менеджера пакетов, такой как conda
:
[dk@jessie/home/dk/qib]$ cat build.sh #!/bin/bash
mkdir build && cd build
cmake -E env CXXFLAGS="-Wl,-rpath,/usr/local/lib64/" cmake -DBUILD_x64=ON -DCMAKE_C_COMPILER=/usr/local/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ ..
make