1

背景: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

我的CMakeLists.txt指定CXX_STANDARD 14CXX_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
4

1 回答 1

3

我的建议是在交叉编译项目时工作:只需设置一个工具链文件并准备构建(Linux 示例):

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

每当您需要更改编译器或只是一些编译选项时,您只需要更改工具链文件,而无需触及 CMakeLists.txt

您可以在此处找到参考资料,但几乎没有任何信息。一个很好的教程在这里

于 2019-01-16T13:19:00.093 回答