如何使用scons在调试模式下获得可执行文件



我使用scons与vc10和renesas编译器进行编译。

是否有任何命令可以在调试模式下获得可执行文件?

如果我用命令"scons"执行我的项目并输入",它将进入发布模式。

我无法使用visual studio调试器调试.exe文件。

谁能告诉我如何在调试模式下获得调试可执行文件?在scons中是否有需要设置的命令或标志?

要使可执行文件处于调试模式,只需向CXXFLAGS构造变量中添加适当的编译器调试标志,如下所示:

env = Environment()
env.Append(CXXFLAGS = ['/DEBUG'])

但这是相当基本的,我想您可能希望能够控制何时通过命令行在调试模式下编译可执行文件。这可以通过命令行目标或命令行选项(如debug=1)来完成

要使用目标,可以这样做:

envRelease = Environment()
envDebug = Environment()
envDebug.Append(CXXFLAGS = ['/DEBUG'])
targetRelease = envRelease.Program(target = 'helloWorld', source = 'helloWorld.cc')
# This makes the release target the default
envRelease.Default(targetRelease)
targetDebug = envDebug.Program(target = 'helloWorldDebug', source = 'helloWorld.cc')
envDebug.Alias('debug', targetDebug)

如果您执行没有命令行目标的SCons,则将构建发布版本,如envRelease.Default()函数所指定的那样。如果您执行带有调试目标的scon,例如:scons debug,则调试版本将按照envDebug.Alias()函数指定的方式构建。

另一种方法是使用命令行参数,如:scons debug=0scons debug=1,这将允许您在构建脚本中执行一些逻辑,从而允许您更容易地控制变量目录等,如下所示:
env = Environment()
# You can use the ARGUMENTS SCons map
debug = ARGUMENTS.get('debug', 0)
if int(debug):
   env.Append(CXXFLAGS = ['/DEBUG'])
   env.VariantDir(...)
else:
   env.VariantDir(...)
env.Program(target = 'helloWorld', source = 'helloWorld.cc')

查看更多命令行处理选项。

最后一个选项,我更喜欢的是总是构建两个版本,每个版本都在各自的variantDir中(例如build/vc10/release和build/vc10/debug)。

envRelease = Environment()
envDebug = Environment()
envDebug.Append(CXXFLAGS = ['/DEBUG'])
envRelease.VariantDir(...)
targetRelease = envRelease.Program(target = 'helloWorld', source = 'helloWorld.cc')
# This makes the release target the default
envRelease.Default(targetRelease)
# This allows you to only build the release version: scons release
envRelease.Alias('release')
envDebug.VariantDir(...)
targetDebug = envDebug.Program(target = 'helloWorld', source = 'helloWorld.cc')
# This makes the debug target get built by default in addition to the release target
envDebug.Default(targetDebug)
# This allows you to only build the debug version: scons debug
envDebug.Alias('debug')

对于MSVC,您需要将调试标志添加到链接器(LINKFLAGS)。一个例子…

Program(path, CPPPATH=env['CPPPATH'], CCFLAGS=env['CCFLAGS'], LIBS=['lib'],
        LIBPATH='.', LINKFLAGS=['/DEBUG'])

您可能还需要在编译器中添加/Zi和/EHsc标志

# this line is meant to go before calling Program
env.Append(CXXFLAGS = ['/Zi', '/EHsc', '/DEBUG'])

显然,在理想的场景中,您应该添加参数逻辑来检测何时需要在接受的答案中看到它们。

相关内容

最新更新