2014-09-26 79 views
1

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

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 

据我了解,在Program建设者不能从后缀确定这些库是否单独从CC++源文件来了,然后选择C。我知道我可以通过指定C代码应该使用g++而不是gcc链接来解决这个问题,但这感觉很脏。有什么方法可以告诉scons它应该链接此程序为C++代码而不是C

回答

2

SCons尝试根据给定源文件的后缀选择链接程序。由于您将库直接粘贴到Program Builder中,因此SCons无法看到它们源于C++文件(现在它们具有“* .a”扩展名)。这就是为什么SCons的“智能链接”功能切换到默认设置,即上述情况下的“$ CC”=“gcc”。

在此,你可以调整你构建了一下,使它看起来更像是这样的:

lib_a = Library('a.cc') 

Program('prog', 'main.cc', LIBS=['a'], LIBPATH=['.']) 

现在,使用SCons能够从“main.cc”文件类型导出链接。 ..并正确调用“g ++”可执行文件(如果可以在当前路径中找到它)。

我不主张这(上面的方法应该是首选),但另一种选择是简单地覆盖该获取与所使用的连接器:

Program('prog', ..., LINK='g++') 
+0

谢谢。我试图避免需要重新排列的东西,但似乎我无法摆脱它。 – 2014-09-26 18:30:26

+0

不客气......我真的相信下面在SCons中做事的标准途径将长期为您付出代价。 – dirkbaechle 2014-09-26 20:44:30

0

@dirkbaechle's answer跟进,实现main.cc没有按不必有任何内容。您可以留下您的所有代码(包括在你的图书馆main(),只是提供一个空白main.cc

一个提供便捷的途径空白main.ccTextfile()

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]) 

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