大家好,欢迎来到IT知识分享网。
Scons背靠Python可以用python语法是一个非常好的构建工具而且自生也很轻便写起来很爽
Scons不同于其他构建工具在其他构建工具里你要链接头文件库文件等声明可以直接写
而Scons不行 他需要你使用他提供的宏
本教程适合有一定编成基础的人看(毕竟都选构建工具了因该不会很不懂)
————————————
Scons的根目录编译文件为SConstruct这个文件就像cmake中的CMakeLists.txt一样
子目录文件是SConscript
Scons参数:
scons -Q —— 安静编译减少输出
scons -n —— 只进行模拟,不实际执行构建
scons -c —— 清理目标文件 也就是.o .obj文件
函数功能:
Environment() —— 创建一个新的构建环境
env —— 一个变量用来存储构建环境
Append —— 一个方法用于向Environment追加新的值配合env可以给Environment()引入变量
LIBPATH —— 用于原文库所搜路径
CPPPATH —— 用于添加头文件搜索路径
LIBS —— 指定要连接的库Scons会自动找到所需的库的.a或.so文件并将连接到最终可执行文件或库中 (Linux会自动找 Windows好像不会)
CFLAGS —— 用于添加C语言编译器选项
CXXFLAGS —— 用于添加C++编译器选项
————————————
基本编译:
Scons编译完会默认生成.o目标文件
env = Environment() env.Program("编译出的项目名","文件.cpp") #也可以多个像python一样用数组就可以实现多个编译了 env.Program("编译出的项目名",["glad.c","main.cpp"]) #甚至你要编译子文件里的源文件也可以,还可以吧编译好的文件指定到目标文件夹内 env.Program("bulid/编译出的项目名","src/main.c")
CC="gcc" #指定c语言编译器 CXX="g++" #指定c++编译器 AS="as" #指定as作为编译器
————————————
编译文件类:
Program('dev','文件.cpp') #编译可执行文件,必须命名编译出的文件 Program(['文件.cpp','main.cpp','库.c']) #编译多个源文件 Object("生成文件名","文件") #生成Object文件(.o文件) 也可以这么写Object("生成文件名",["文件1.c"],[文件b.cpp]) library('') #编译成库文件,scons默认编译的库是指静态链接库 SharedLibrary('') #编译成动态链接文件
————————————
链接第三方库:
CC="clang" CXX="g++" env=Environment() env.Append(LIBPATH=['/usr/lib','/home/zhu/桌面/1.3.275.0/x86_64/lib']) #添加库lib位置 env.Append(CPPPATH=['/usr/include','/home/zhu/桌面/1.3.275.0/x86_64/include']) #添加头文件位置 env.Append(LIBS=["Vulkan","glfw3","glm"]) #申明需要的库 #非必需操作 env.SharedLibrary(target, source) #使用这个函数创建共享库,并链接所需的库.target参数是生成的共享库的名称,source参数是源文件. env.StaticLibrary(target, source) #使用这个函数创建静态库,并链接所需的库.target参数是生成的静态库的名称,source参数是源文件. env.Program("main",'test.cpp')
这个Append是env里的一个方法这个方法可以用来链接库,源文件列表等里面的LIBS,LIBPATH,CPPPATH都不能换成其他的这些是固定的枚举代表的意思都不同
SharedLibrary方法的意思是构建共享库用的
差不多Scons常用的就这些了日常也够用了,还有一些要写大项目的要创建子文件夹的那就:
import os # 创建环境对象 env = Environment() # 设置编译器和链接器标志 env['CXX'] = 'g++' env['CXXFLAGS'] = '-std=c++11' # 设置头文件搜索路径(如果需要) env.Append(CPPPATH=['#include_dir']) # 指定源文件所在的文件夹 source_dir = 'src' # 假设源文件在名为 'src' 的子文件夹中 # 使用 Glob 函数获取所有源文件 source_files = env.Glob(os.path.join(source_dir, '*.cpp')) # 编译程序 program = env.Program(target='my_program', source=source_files) # 默认目标是构建程序 Default(program)
你也可以直接手动指定文件夹下的 文件然后对其编译 我这里用了os的方法来实现的
下面是我的项目scons配置:
# 导入SCons模块 import os import SCons CC="calng" CXX="g++" env=Environment() env.Append(LIBPATH=['/usr/lib']) #添加库lib位置 env.Append(CPPPATH=['/usr/include']) #添加头文件位置 env.Append(LIBS=["Vulkan","glfw3","glm"]) #申明需要的库,注意LIBS要在头文件和lib申明之后不然会显示找不到库 Program("main",'test.cpp')
注意:注意LIBS要在头文件和lib申明之后不然会显示找不到库
注意:Linux下你指定了/usr/include和/usr/lib了之后你那里面一定要有比如include里要有头文件
lib里面要有cmake和库的依赖不要忘记!!!要全放进去!
如果你要写一个项目要采取文件目录的形式可以采用
Import('env') # 读取 src 目录下的 SConscript 文件 #SConsript可以有两个参数 #variant_dir:指定变体目录,即构建输出目录 #duplicate:设置是否复制源目录的文件到变体目录。 SConscript('src/SConscript', variant_dir='build/subdir', duplicate=0)
Import('env')
表示导入 SCons 的环境变量,允许在 SConscript 文件中使用。SConscript('src/SConscript', variant_dir='build', duplicate=0)
加载src/SConscript
,并将构建结果放入build
目录,duplicate=0
表示不复制源文件到构建目录- SCsub —— 和SConscript差不多,用于在项目中定义和管理子构建(sub-builds)和构建逻辑 SCsub文件允许你将构建过程分解为多个子模块,并在主
SConstruct
文件中包含这些模块。通常用于较大的项目例如Godot游戏引擎#文件结构 project/ │ ├── SConstruct ├── src/ │ ├── main.cpp │ └── SCsub └── lib/ ├── foo.cpp └── SCsub #SConstruct: env = Environment() # 包含 lib 目录中的 SCsub 文件 SConscript('lib/SCsub') # 包含 src 目录中的 SCsub 文件 SConscript('src/SCsub') #lib/SCsub: env = Environment() # 编译 lib 中的源文件 env.Program('libfoo', 'foo.cpp') #src/SCsub: env = Environment() # 编译 src 中的源文件 env.Program('main', 'main.cpp')
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/130071.html