Как указать CMake на другую версию компилятора и libstdc ++ - PullRequest
0 голосов
/ 16 января 2019

Фон: По умолчанию 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

1 Ответ

0 голосов
/ 16 января 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...