【发布时间】:2014-03-08 11:31:44
【问题描述】:
我正在尝试使用Scons 在我有权在特定位置(而不是/usr/)安装东西的服务器上构建一个简单的项目。由于我对服务器提供给我的默认编译器不满意,我安装了g++4.8 并验证它工作正常。但是当我尝试使用Scons 来构建一个简单的项目时,虽然它选择了正确的g++(我可以通过检查版本来得到它),它在/usr/ 目录中寻找libstdc++ 而不是所在的目录g++4.8 安装驻留。例如。代码编译,但执行失败:
./main: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main)
再一次 - 当我自己从终端调用编译器时,这不会发生。
即使我使用 LIBPATH 选项添加包含 g++4.8 库的库路径,我也会收到相同的错误。
这是我的 SConscript 文件:
Import('env')
COMPILER_FLAGS = '-Wall -fopenmp -O3 -std=c++11'
LINK_FLAGS = '-Wall -fopenmp -O3 -std=c++11'
LIB_PATH = 'myfolder/gcc-4.8.2/lib64'
PROGRAM = 'main'
SRC = ['main.cpp', 'Foo.cpp']
env.Append(CPPFLAGS = COMPILER_FLAGS)
env.Append(LINKFLAGS = LINK_FLAGS)
env.Program(target = PROGRAM, source = SRC, LIBPATH = LIB_PATH)
而 SConstruct 只是
import os
env = Environment(ENV = os.environ)
SConscript('./SConscript', exports=['env'], duplicate=0)
编辑:
我确保编译器的位置位于默认编译器之前的路径中。但即使我用Environment(CXX=...) 明确设置它也是一样的。这是构建输出:
/mypath/gcc-4.8.2/bin/g++ -o Foo.o -c -Wall -fopenmp -O3 -std=c++11 Foo.cpp
/mypath/gcc-4.8.2/bin/g++ -o main.o -c -Wall -fopenmp -O3 -std=c++11 main.cpp
/mypath/gcc-4.8.2/bin/g++ -o main -Wall -fopenmp -O3 -std=c++11 main.o Foo.o -L/mypath/gcc-4.8.2/lib64
scons: done building targets.
-bash-3.2$
-bash-3.2$
-bash-3.2$ ./main
./main: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main)
./main: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./main)
-bash-3.2$
又一次修改:
手动和 scons 上的 ldd 编译显示:
linux-vdso.so.1 => (0x00007fff513fd000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6(0x0000003e7f600000)
libm.so.6 => /lib64/libm.so.6 (0x0000003e79600000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003e7de00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003e79200000)
/lib64/ld-linux-x86-64.so.2 (0x0000003e78e00000)
确实,即使手动编译也不会在正确的目录(或我安装编译器的位置)中查找库,问题不在于 scons 本身,但可能是我没有正确配置某些东西,但是那么我真的很困惑为什么可执行文件运行良好,而对于 scons 却没有。
好的,所以我的问题不在于 scons,而在于我没有给出指向 libstdc++ 和朋友的非标准位置的明确路径。 SO answer在这里更详细地解释了这一点: Linking g++ 4.8 to libstdc++
【问题讨论】:
标签: linker g++ scons libstdc++