Linker 如何让SCON寻找libstdc++;在非标准目录中
我正在尝试使用Linker 如何让SCON寻找libstdc++;在非标准目录中,linker,g++,scons,libstdc++,Linker,G++,Scons,Libstdc++,我正在尝试使用Scons在服务器上构建一个简单的项目,在这个服务器上,我有权只在特定的位置(而不是/usr/)安装东西。由于我对服务器提供的默认编译器不满意,我安装了g++4.8,并验证了它工作正常。但是,当我尝试使用Scons构建一个简单的项目时,虽然它选择了正确的g++(我可以通过检查版本得到),但它在/usr/目录中查找libstdc++,而不是g++4.8安装所在的目录。例如,代码可编译,但执行失败时: ./main: /usr/lib64/libstdc++.so.6: version
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
添加包含库的lib路径时,也会出现相同的错误。
这是我的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)
编辑:
我确保编译器的位置位于默认编译器之前的路径中。但是,即使我使用环境(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$
还有一个编辑:
手册和SCON上的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)
因此,实际上,即使是手动编译也没有在正确的目录(或我安装编译器的地方)中查找libs,问题不在于scon本身,而可能是我没有正确配置某些内容,但我真的很困惑,为什么可执行文件可以正常运行,而scon却不能
好吧,我的问题不在于scon,而是我没有给出libstdc++和朋友的非标准位置的显式路径。这里的答案更详细地解释了这一点: 这听起来不对。 你能告诉我们你怎么重写编译器吗? 如果您只执行上述操作,我认为您的编译器不会被新版本覆盖 你需要像这样做 env=Environment(CC='/path/to/gcc') 或环境(CXX=‘/PAT/TO/G+++’),如果您想重写C++编译器 或者,环境中的路径设置是否将自定义编译器的目录置于标准编译器目录之前 清理并运行带有--debug=presub的scon可能会有所帮助,它将向您显示用于构建每个目标的命令行。 此外,您的环境是一个字典,因此请尝试打印不同的键,以确保它们与您期望的匹配:
print env['CC']
print env['CXX']
这听起来不对。
你能告诉我们你怎么重写编译器吗?
如果您只执行上述操作,我认为您的编译器不会被新版本覆盖
你需要像这样做
env=Environment(CC='/path/to/gcc')
或环境(CXX=‘/PAT/TO/G+++’),如果您想重写C++编译器
或者,环境中的路径设置是否将自定义编译器的目录置于标准编译器目录之前
清理并运行带有--debug=presub的scon可能会有所帮助,它将向您显示用于构建每个目标的命令行。
此外,您的环境是一个字典,因此请尝试打印不同的键,以确保它们与您期望的匹配:
print env['CC']
print env['CXX']
这听起来不对。
你能告诉我们你怎么重写编译器吗?
如果您只执行上述操作,我认为您的编译器不会被新版本覆盖
你需要像这样做
env=Environment(CC='/path/to/gcc')
或环境(CXX=‘/PAT/TO/G+++’),如果您想重写C++编译器
或者,环境中的路径设置是否将自定义编译器的目录置于标准编译器目录之前
清理并运行带有--debug=presub的scon可能会有所帮助,它将向您显示用于构建每个目标的命令行。
此外,您的环境是一个字典,因此请尝试打印不同的键,以确保它们与您期望的匹配:
print env['CC']
print env['CXX']
这听起来不对。
你能告诉我们你怎么重写编译器吗?
如果您只执行上述操作,我认为您的编译器不会被新版本覆盖
你需要像这样做
env=Environment(CC='/path/to/gcc')
或环境(CXX=‘/PAT/TO/G+++’),如果您想重写C++编译器
或者,环境中的路径设置是否将自定义编译器的目录置于标准编译器目录之前
清理并运行带有--debug=presub的scon可能会有所帮助,它将向您显示用于构建每个目标的命令行。
此外,您的环境是一个字典,因此请尝试打印不同的键,以确保它们与您期望的匹配:
print env['CC']
print env['CXX']
你误解了错误。GCC总是知道如何找到自己的库,包括libstdc++。问题是,编译完程序后,运行时链接器(不是GCC的一部分,它是操作系统的一部分,来自glibc)不知道如何找到较新的libstdc++,因此它会找到默认的系统链接器,它太旧了
Libstdc++常见问题解答和手册中描述了问题和解决方案,您误解了错误。GCC总是知道如何找到自己的库,包括libstdc++。问题是,编译完程序后,运行时链接器(不是GCC的一部分,它是操作系统的一部分,来自glibc)不知道如何找到较新的libstdc++,因此它会找到默认的系统链接器,它太旧了
Libstdc++常见问题解答和手册中描述了问题和解决方案,您误解了错误。GCC总是知道如何找到自己的库,包括libstdc++。问题是,编译完程序后,运行时链接器(不是GCC的一部分,它是操作系统的一部分,来自glibc)不知道如何找到较新的libstdc++,因此它会找到默认的系统链接器,它太旧了 在Libstdc中描述了问题和解决方案+