我正在尝试使用Scons
在服务器上构建一个简单项目,我有权在特定位置安装内容(而不是/usr/
)。由于我对服务器提供给我的默认编译器不满意,我安装了g++4.8
并验证它运行正常。但是当我尝试使用Scons
来构建一个简单的项目时,它会选择正确的g++
(我可以通过查看版本来获得),它正在{{1}中寻找libstdc++
目录而不是/usr/
安装所在的目录。例如。代码编译,但执行失败时:
g++4.8
再次 - 当我从终端自己调用编译器时,这不会发生。
即使我使用LIBPATH选项添加包含./main: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main)
库的lib路径,我也会得到相同的错误。
这是我的SConscript文件:
g++4.8
和SConstruct只是
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)
编辑:
我确保我的编译器的位置在默认编译器之前的路径中。但即使我用import os
env = Environment(ENV = os.environ)
SConscript('./SConscript', exports=['env'], duplicate=0)
明确地设置它,它也是同一个故事。这是构建输出:
Environment(CXX=...)
又一个编辑:
手册和scons汇编上的ldd显示:/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$
所以甚至手动编译确实没有在正确的目录中找到libs(或者我安装编译器的地方),问题不在于scons本身,但可能是我没有正确配置,但是然后我真的很困惑为什么可执行文件运行正常,而它不适用于scons。
好的,所以我的问题不在于scons,而在于我没有给libstdc ++和朋友的非标准位置提供明确的路径。这里的答案更详细地解释了这一点: Linking g++ 4.8 to libstdc++
答案 0 :(得分:2)
您错误地解释了错误。 GCC总是知道如何找到自己的库,包括libstdc ++。问题是,在您编译程序之后,运行时链接程序(它不是GCC的一部分,它是您的操作系统的一部分,来自glibc)并不知道如何找到较新的libstdc ++ ,所以它找到了默认的系统,这太旧了。
问题和解决方案在Libstdc ++常见问题解答"How do I insure that the dynamically linked library will be found?"和手册"Finding Dynamic or Shared Libraries"
中有所描述。答案 1 :(得分:1)
这听起来不对。 你能告诉我们你做什么来覆盖编译器吗? 如果您只是执行上述操作,我认为您的编译器不会被新版本覆盖。
你需要做类似的事情 env =环境(CC ='/ path / to / gcc') 或者环境(CXX ='/ path / to / g ++')如果要覆盖c ++编译器
或者您的环境设置路径是否在标准编译器目录之前拥有自定义编译器的目录?
使用--debug = presub可以帮助清理然后使用scons运行,它将显示用于构建每个目标的命令行。 您的环境也是字典,因此请尝试打印不同的密钥以确保它们符合您的预期:
print env['CC']
print env['CXX']