gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:00:53 29 4
gpt4 key购买 nike

我正在尝试使用 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

最佳答案

SCons 尝试根据给定源文件的后缀选择一个链接器。由于您将库直接粘贴到程序生成器中,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++')

关于c++ - Scons,仅从静态库构建 C++ 可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26063372/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com