Scons,仅从静态库构建C++可执行文件
问题描述:
我正在尝试使用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
建设者不能从后缀确定这些库是否单独从C
或C++
源文件来了,然后选择C
。我知道我可以通过指定C
代码应该使用g++
而不是gcc
链接来解决这个问题,但这感觉很脏。有什么方法可以告诉scons它应该链接此程序为C++
代码而不是C
?
答
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++')
答
上@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
将在需要时创建。
谢谢。我试图避免需要重新排列的东西,但似乎我无法摆脱它。 – 2014-09-26 18:30:26
不客气......我真的相信下面在SCons中做事的标准途径将长期为您付出代价。 – dirkbaechle 2014-09-26 20:44:30