scons自动生成.out后缀_可执行程序文件

构建工具make,cmake,scons对比

make 语法/语义不明,即像shell, 又不是shell, 处理字符串,变量晦涩难懂
cmake 语法/语义比较明确,熟悉关键字, 处理字符串,变量比较方便; 缺点语法自成一派, 有学习成本
scons 使用python语法,pythonb库,处理字符串,逻辑判断清晰明了, 可以调用python库,作为跨平台构建工具, 很合适

1.scons构建c/c++实例

SConstruct

Program('1_hello.cpp')

scons
g++ -o 1_hello.o -c 1_hello.cpp
g++ -o 1_hello 1_hello.o

2.scons生成.out后缀,可执行文件

2.1 方法1: python字符串-截取-拼接

SConstruct

import os
def gen_exec_file(file):
    return os.path.splitext(file)[0]+'.out'

env = Environment()
env['CCFLAGS'] = '-g'
env['CXXFLAGS'] = '-g'
env.Append(CXXFLAGS=['-Ddebug','-Wall'])

def build_out(src_file):
    src = Split(src_file)
    target = gen_exec_file(src[0])
    env.Program(target, src)

build_out('1_hellp.cc')

g++ -o 1_hello.o -c -g -Ddebug -Wall -g 1_hello.cpp
g++ -o 1_hello.out 1_hello.o

2.2 方法2: scons内置环境变量

官网文档说明: https://scons.org/doc/production/HTML/scons-man.html#cv-PROGSUFFIX
SConstruct

## 模板1
env = Environment()
env["PROGSUFFIX"] = ".out"            # 可执行文件后缀.out
env["CCFLAGS"] = " -g3 -O0 -Wall"  # gdb 调试
env.Program("demo.c")

## 模板2
DefaultEnvironment(PROGSUFFIX = '.out') # 可知程序后缀为.out
ccflags = "-g3 -O0 -Wall"       # gdb 调试
libs = "pthread"
Program("demo.cc", CCFLAGS=ccflags, LIBS=libs)

生成.out后缀 原因:

  • .gitignore 不能识别二进制文件, 只能通过后缀名匹配. 提交代码时, 容易误添加.
  • 故可执行文件后缀名添加.out, 方便git过滤

其它

  1. .gitignore如果过滤二进制文件 --> bing搜索, 大模型无解决方法
  2. scons是否有更简洁的, 生成.out后缀方法 --> 方法2: scons内置环境变量

SCons是一个强大的构建工具,它支持自定义构建过程。如果你想通过SCons生成`compile_command.json`文件,这通常用于静态分析工具,如Clang-Tidy或Pylint等,它们需要命令行构建信息以便分析源代码,这个过程涉及到配置SCons来生成合适的命令。 首先,你需要确保你的SConstruct文件SCons的基本配置文件)中包含了对构建目标的规则,比如编译、链接步骤。当运行`scons`命令时,SCons会生成一系列实际执行的构建指令。例如: ```python env = Environment(CCFLAGS='-std=c++11', LDFLAGS='-lmylib') cpp_sources = Glob('src/*.cpp') program = env.Program('myapp', cpp_sources) ``` 然后,你可以选择创建一个自定义的动作(Action)或回调函数,在该函数中手动收集并保存构建命令到`compile_command.json`。这里有一个简单的例子: ```python def save_commands(target, source, env): compile_commands = [] for src in source: compile_commands.append(env.Command( 'json/%s' % os.path.basename(src), # 输出文件路径 src, str(env.Command(target=target[0], source=src, action='')) # 这里的action可能是空字符串 )) with open('compile_command.json', 'w') as f: json.dump([c.abspath for c in compile_commands], f) program.add_post_action(save_commands) ``` 当你运行`scons`时,SCons会先执行常规的构建,然后触发`save_commands`动作来创建`compile_command.json`。 注意:这并不是SCons的标准功能,而是根据特定需求定制的。如果你正在寻找更直接的方式,可能需要查阅具体的SCons插件或第三方工具,如scons-buildinfo这类库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值