C++ 斯科恩斯,C栋和x2B栋+;仅可从静态库执行

C++ 斯科恩斯,C栋和x2B栋+;仅可从静态库执行,c++,scons,C++,Scons,我正在尝试使用scons从三个静态库构建一个可执行文件。但是,即使源文件具有.cc后缀,仍会选择gcc链接最终可执行文件,而不是g++。下面的SConstruct演示了这个问题 lib_a = Library('a.cc') lib_b = Library('b.cc') lib_c = Library('c.cc') Program('prog',[lib_a,lib_b,lib_c]) 然后输出要运行的以下命令 g++ -o a.o -c a.cc g++ -o b.o -c b.cc g

我正在尝试使用
scons
从三个静态库构建一个可执行文件。但是,即使源文件具有
.cc
后缀,仍会选择
gcc
链接最终可执行文件,而不是
g++
。下面的SConstruct演示了这个问题

lib_a = Library('a.cc')
lib_b = Library('b.cc')
lib_c = Library('c.cc')
Program('prog',[lib_a,lib_b,lib_c])
然后输出要运行的以下命令

g++ -o a.o -c a.cc
g++ -o b.o -c b.cc
g++ -o c.o -c c.cc
ar rc liba.a a.o
ranlib liba.a
ar rc libb.a b.o
ranlib libb.a
ar rc libc.a c.o
ranlib libc.a
gcc -o prog liba.a libb.a libc.a

据我所知,
程序
生成器无法仅从后缀确定这些库是来自
C
还是
C++
源文件,然后选择
C
。我知道我可以通过指定
C
代码应该使用
g++
而不是
gcc
链接来解决这个问题,但这感觉很脏。有没有办法告诉scons,它应该将此程序链接为
C++
code而不是
C

scons尝试根据给定源文件的后缀选择链接器。既然你把库直接插入程序生成器,SCons就不能看到它们来自C++文件(现在它们有“*.a”扩展名)。这就是为什么SCons的“smartlink”功能会切换到其默认值,在上面的例子中是“$CC”=“gcc”

与此相反,您可以稍微重组构建,使其看起来更像:

lib_a = Library('a.cc')

Program('prog', 'main.cc', LIBS=['a'], LIBPATH=['.'])
现在,SCons能够从“main.cc”文件类型派生链接器……并正确调用“g++”可执行文件(如果可以在当前路径中找到)

我不主张这样做(应该首选上述方法),但另一种选择是简单地覆盖与以下内容一起使用的链接器:

Program('prog', ..., LINK='g++')
接下来,要意识到
main.cc
不必有任何内容。您可以将所有代码(包括
main()
保留在库中,只需提供一个空白的
main.cc

提供空白
main.cc
的一种方便方法是:


这样,您就不必向源代码中添加任何文件,因为
main.cc
将在需要时创建。

谢谢。我试图避免需要重新安排内容,但似乎我无法摆脱。哦,不客气……我真的相信,遵循在SCON中执行操作的标准路径会有帮助从长远来看,你会得到回报。
env = Environment(tools=['default', 'textfile'])
lib_a = env.Library('a.cc')
lib_b = env.Library('b.cc')
lib_c = env.Library('c.cc')
main_cc = env.Textfile('main.cc', [])
env.Program('prog',[main_cc, lib_a,lib_b,lib_c])