Как указать CMake на другую версию компилятора и libstdC++

Фон: по умолчанию gcc версия о Debian Джесси 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

Мой 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

1 ответ

Мое предложение состоит в том, чтобы работать во время кросс-компиляции вашего проекта: просто настройте файл инструментария и подготовьтесь к сборке (пример Linux):

mkdir -p build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=path/to/the/toolchain/file ..

Всякий раз, когда вам нужно изменить компилятор или просто некоторые параметры компиляции, вам просто нужно изменить файл цепочки инструментов, не касаясь CMakeLists.txt

Ссылку можно найти здесь, но информации почти нет. Хороший учебник здесь.

Другие вопросы по тегам