我重新组织了现有项目的目录树,进行了相关的Sconscript更改,在这样做时我引入了以下链接器错误:
/ bin / ld:注意:'__ cxa_free_exception @@ CXXABI_1.3'在DSO /usr/lib64/libstdc++.so.6中定义,因此请尝试将其添加到链接器命令行 /usr/lib64/libstdc++.so.6:无法读取符号:操作无效 collect2:错误:ld返回1退出状态
我发现了这个thread,如果我遵循这个建议并尝试明确系统库,那么它就会在未来发生故障(随后的错误将是关于libm等等与其他系统库)
由于在没有重组的情况下编译得很好,可以对scons做什么,它不再链接到系统库?
现有的SConstruct / Sconscript文件集中没有任何对任何系统库链接的引用。这是由scons自动完成的,但是现在我重新安排了几个子项目,我遇到了上述错误。
libpath和rpath都包含以下内容: '的/ usr / lib64下', '的/ usr / lib64下/ MySQL的', '的/ usr / local / lib目录',
链接器命令
gcc -o build/debug/icln/src/foo/fooCert/build/scons/fooCertFromFiles -Wl,-rpath=/usr/lib64 -Wl,-rpath=/usr/lib64/mysql -Wl,-rpath=/usr/local/lib -Wl,-rpath=/ws/build/debug/icmn/src/common -Wl,-rpath=../../../../engine/build/scons -Wl,-rpath=../../../../foo/build/scons -Wl,-rpath=../../../../kb/build/scons -Wl,-rpath=../../../../bar/build/scons -Wl,-rpath=../../../../tables/build/scons -Wl,-rpath=../../../../utils/build/scons -L/usr/lib64 -L/usr/lib64/mysql -L/usr/local/lib -Lbuild/debug/icmn/src/common -L/ws/icmn/src/common -Lbuild/debug/icln/src/engine/build/scons -Lsrc/engine/build/scons -Lbuild/debug/icln/src/foo/build/scons -Lsrc/foo/build/scons -Lbuild/debug/icln/src/kb/build/scons -Lsrc/kb/build/scons -Lbuild/debug/icln/src/bar/build/scons -Lsrc/bar/build/scons -Lbuild/debug/icln/src/tables/build/scons -Lsrc/tables/build/scons -Lbuild/debug/icln/src/utils/build/scons -Lsrc/utils/build/scons -lcengine -lbar -lfoo -lkb -lcutils -lCommon -ltables -lglog -lboost_date_time -lboost_serialization -lboost_system -lboost_filesystem -lmongoclient -lboost_thread -lpthread -lmysqlcppconn -lmysqlclient
更新:我注意到构建最终二进制文件的调用是gcc,而不是g ++。我仍然试图确定为什么它突然切换到gcc而不是g ++,但我认为这是朝向根本原因。
scons如何确定是否调用CC vs CXX?
答案 0 :(得分:0)
解决:因为我执行了重组,所以对Glob()的调用正在解析为空列表,因为我已经改变了源文件所在的路径。
修复:我需要更新Glob调用以使用新的源路径(Sconscript和源文件不再与之前共存于同一目录中)。
在
source = Glob('*.cc')
在
source = Glob('../../src/*.cc')