Scons,仅从静态库构建C ++可执行文件

时间:2014-09-26 15:43:57

标签: 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++ -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构建器无法单独根据后缀确定这些库是来自C还是C++源文件,然后选择C。我知道我可以通过指定C代码应使用g++而不是gcc进行链接来解决此问题,但这感觉很脏。有没有办法告诉scons它应该将此程序链接为C++代码而不是C

2 个答案:

答案 0 :(得分:2)

SCons尝试根据给定源文件的后缀选择一个链接器。由于您将库直接插入到程序生成器中,因此SCons无法看到它们源于C ++文件(它们现在具有" * .a"扩展名)。这就是" smartlink" SCons的功能切换到默认值,即" $ CC" =" gcc"在你的情况下。

对此,您可以稍微重构一下构建,并使其看起来更像这样:

lib_a = Library('a.cc')

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

现在,SCons能够从" main.cc" ...的文件类型派生链接器并正确调用" g ++"可执行文件(如果可以在当前路径中找到)。

我不提倡这个(上面的方法应该是首选的),但另一种选择是简单地覆盖使用的链接器:

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

答案 1 :(得分:0)

跟进@dirkbaechle's answer,意识到main.cc不必拥有任何内容。您可以将所有代码(包括main())保留在库中,只提供空白main.cc

提供空白main.cc的一种便捷方法是Textfile()

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