Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将CMake指向不同版本的编译器和libstdc++;_Cmake - Fatal编程技术网

如何将CMake指向不同版本的编译器和libstdc++;

如何将CMake指向不同版本的编译器和libstdc++;,cmake,Cmake,背景:默认gccDebian Jessie4.9.2版本不支持CXX\U标准14 [dk@jessie /home/dk/qib]$ /usr/bin/gcc --version gcc (Debian 4.9.2-10+deb8u1) 4.9.2 My指定上所需的CXX\U标准14和CXX\U标准 因此,我从源代码构建了8.2.0,并安装在/usr/local/bin/位置: [dk@jessie /home/dk/qib]$ /usr/local/bin/gcc --version gcc

背景:默认
gcc
Debian Jessie
4.9.2
版本不支持
CXX\U标准14

[dk@jessie /home/dk/qib]$ /usr/bin/gcc --version
gcc (Debian 4.9.2-10+deb8u1) 4.9.2
My指定上所需的
CXX\U标准14
CXX\U标准

因此,我从源代码构建了
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 ..

问题:编译后的二进制文件指向old
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
):


问题:假设(理想情况下)无法接触原始的
CMakeLists.txt(位于上游)或使用
LD\u库路径
(),是否有更好的、可移植的、可分发的方法来自动化构建

我的草稿
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

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

每当您需要更改编译器或某些编译选项时,只需更改工具链文件,而不必触摸CMakeLists.txt

你可以找到参考资料,但几乎没有任何信息。一个好的教程是。

根据,
-H
-B
标志没有文档化,因为它们不应该被使用。答案链接说,
“这些是未记录的,因为它们是内部选项,不供公众使用”
,建议改为
mkdir-p“$build”&&pushd“$build”&&cmake“$src”&&popd
[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
mkdir -p build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=path/to/the/toolchain/file ..