scons 实用说明(一)

2023-10-27

还在为写一个makefile发愁吗?还在为难记的make参数而苦恼吗?有了scons一切都边的简单了。最近研究了下scons,发现和makefile相比,soncs编译c和c++程序真的太方便了。搞程序什么做好,当然是简单实用最好下面大家就一起感受下简单的scons吧。

1、使用scons编译程序

在程序目录下执行命令如下:(前提是你已经安装scons了哟)

    scons                  

噢,噢,这个好像没啥简单的哈,和make差不多嘛。是吗?那就继续瞧好吧您吐舌头

2、清空编译程序

    在程序目录下执行命令如下

    scons -c

    这个嘛,,没什么吧,和make clean也没简单多少呀,不就少了几个字母吗,是吗?那咱还继续吧

3、将cpp或c文件编译为执行文件

    在源文件目录中创建一个SConstruct的文件,并在其中添加如下内容

    Program('testPro1', Glob('*.cpp'))

    保存后执行1中的scons命令

    这就完事了??是的!这就完事了,只要你程序的语法没错,应该会生成一个名字叫testPro1的程序,如果在window下会生成一个testPro1.exe的程序哟,有没有很酷?

    将cpp或c文件编译为执行文件有如下2中方式

    方式1:

        Program('程序名', Split('程序文件序列 空格分隔'))  

    方式2:

    Program('程序名', Glob('*.cpp'))  

4、编译的时候想添加上-g -O2 -Wall参数

    使用环境变量

    env=Environment(CCFLAGS = ['-g','-O3','-Wall'])  

    生成程序的时候使用env.Program(。。。。)即可
    例如:
    env=Environment(CCFLAGS = ['-g','-O3','-Wall'])  
    env.Program('程序名', Glob('*.cpp'))

5、编译生成静态库

    方法1:使用Library关键字

    Library('库名', Split('程序文件序列,空格分隔')

    

    Library('库名', Glob('*.cpp'))

    方法2:使用显示关键字StaticLibrary

    StaticLibrary('库名', Split('程序文件序列,空格分隔'))

    

    StaticLibrary('库名', Glob('*.cpp'))

    说明:库名不要前面的lib和后缀,如库libtestdota.a生成时的库名为testdota

6、编译生成动态库

    使用关键字SharedLibrary

    SharedLibrary('库名', Split('程序文件序列,空格分隔'))

    

    SharedLibrary('库名', Glob('*.cpp'))

    说明:库名不要前面的lib和后缀,如库libtestso.so生成时的库名为testso

7、程序或库中引用已有的库

    使用关键字LIBS和LIBPATH

    LIBS后跟程序需要引用的库名

    LIBPATH后跟程序引用库的时候所需的库文件路径

    如:

    Program('testPro','prog.c', LIBS = ['m','m2'], LIBPATH = ['/usr/lib', '/usr/local/lib'])

    生成的testPro程序要引用库libm.so和libm2.so,库文件路径在/usr/lib和/usr/local/lib下

8、指定程序编译过程中需要查找的头文件路径

    使用关键字CPPPATH

    例如:

    Program('hello','hello.c', CPPPATH = ['include', '/home/project/inc'])

    生成hello程序的时候hello.c可能引用了其他的头文件,在编译hello.c的时候会查找./include和/home/project/inc下是否有需要的头文件

    到此一些常用的makefile的功能基本都有了,有没有觉得很简单那微笑,后面会继续写一些实用的相对复杂一些的功能,希望大家能够喜欢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scons 实用说明(一) 的相关文章

  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • 在 C++ 中将成对向量转换为两个独立向量的最快方法

    假设我有一个vector of pair
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 类中不允许使用不完整类型,但类模板中允许使用不完整类型

    以下为无效代码 struct foo struct bar bar x error field x has incomplete type struct bar int value 42 int main return foo x valu
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • HttpComponents(Apache HttpComponents Client 4.1.3)通过代理访问网页的设置方法

    HttpClient httpclient new DefaultHttpClient 这里是设置代理服务器的地方 HttpHost proxy new HttpHost 10 10 228 43 808 http httpclient g
  • win7 升级到 win10

    摘要 项目上遇到一个问题 客户提供一个软件在设备上点击运行后 转圈加载下就没有下文了 但是其他的软件又能正常运行 尝试了漏洞修护 系统修护 兼容性运行 管理员运行 32位兼容性进程检测等方式都不行 只能采取将win7升级到win10一试 在
  • vue学习,v-for不渲染

    最近在学习vue 使用axios v for做个搜索天气的小练习 发现只有第一次搜索有数据 改变数组后vue for不渲染 但使用console log可以看到数据确实更新了 使用this forceUpdate 这个不起作用 没办法了 只
  • Python实现桶排序

    Python实现桶排序 一 桶排序简介 桶排序 Bucket sort 是一种通过分桶和合并实现的排序算法 又被称为箱排序 桶排序先将数据分到有限数量的桶里 然后对每一个桶内的数据进行排序 桶内排序可以使用任何一种排序算法 如快速排序 最后
  • JVM系列(九) 垃圾收集器之 Serial / Serial Old

    回收期演变及概览 前面我们讲了很多 垃圾收集的原理和知识点 下面我们针对各种垃圾收集器进行JVM调优 JVM调优其实都是根据对应的垃圾收集器特性而去做调整和优化 不同垃圾收集器的产生总体可以划分为几个阶段 第一阶段 单线程收集时代 Seri
  • 【Unity粒子系统】

    转自 https blog csdn net m0 37679113 article details 75893700 接下来的图片就是Unity2017 1 0f3 编辑器中的粒子系统模块 了解粒子系统 必须先了解每一个属性都代表了什么
  • 程序员为什么被叫做“码农”,我来和大家聊一聊

    在现代社会 计算机技术和互联网行业的迅速发展 使得程序员这个职业在人们心中越来越受到重视 然而 与此同时 也出现了一些对于程序员职业的误解和偏见 今天我就想和小伙伴们一起聊聊这个有趣的话题 程序员被叫做 码农 名字的由来 让大家更加了解程序
  • rt-thead-studio 中实现 MPU6050基于DMP中断读取数据

    rt thead studio 中实现 MPU6050基于DMP中断读取数据 目录 文章目录 rt thead studio 中实现 MPU6050基于DMP中断读取数据 目录 toc 前言 mpl高级特性库问题 一 基于开发板创建闪灯工程
  • DNS服务器概念

    DNS服务概述 DNS Domain Name System 域名系统 在TCP IP 网络中有非常重要的地位 能够提供域名与IP地址的解析服务 DNS 是一个分布式数据库 命名系统采用层次的逻辑结构 如同一棵倒置的树 这个逻辑的树形结构称
  • linux中zip文件解压命令,Linux中zip压缩和unzip解压缩命令使用方法

    Linux继承了Unix以网络为核心的设计思想 是一个性能稳定的多用户网络操作系统 在Linux中 我们可以利用命令进行文件压缩 即zip压缩和unzip解压缩 这篇文章主要介绍了详解Linux中zip压缩和unzip解压缩命令及使用详解
  • 样本方差的快速计算-遍历一遍样本集

    在统计学中 经常需要样本的方差计算 比较麻烦的方式是 1 第一次遍历计算出样本的平均值 2 第二次遍历才能计算出样本的方差 上述方法在样本较少的情况下 非常合适 但如果样本非常大 这种方式就不可取了 而且如果样本是持续增长的 就都不适用了
  • Unity3d学习笔记(一)

    作业内容 1 简答题 解释 游戏对象 GameObjects 和 资源 Assets 的区别与联系 Asset是存储在硬盘上的文件 保存在Unity项目的Assets文件夹内 资源一定可以存在磁盘上 对象是运行期的东西 资源可以被对象使用
  • SLAM学习1 Ubuntu16.04安装ROS-kinetic

    wishchin sudo sh c echo deb http packages ros org ros ubuntu lsb release sc main gt etc apt sources list d ros latest li
  • 2023牛客暑假多校7 CIM 题解

    文章目录 C Beautiful Sequence https ac nowcoder com acm contest 57361 C I We Love Strings https ac nowcoder com acm contest
  • Golang读取配置文件(*.ini)信息

    package main import fmt io ioutil regexp strings func checkErr e error if e nil panic e 函数名 getCfg tag string cfg string
  • Spring之ApplicationContext与BeanFactory详解

    BeanFactory和ApplicationContext Spring通过一个配置文件描述Bean和Bean之间的依赖关系 利用Java反射功能实例化Bean 并建立Bean之间的依赖关系 Spring的IOC容器在完成这些底层工作的基
  • Centos7 配置端口转发

    场景 有两台服务器主机 希望通过A主机的8080端口间接访问B主机的80 端口 开启系统路由模式功能 echo net ipv4 ip forward 1 gt gt etc sysctl conf 运行这个命令会输出上面添加的那一行信息
  • STC89C52单片机数码管介绍以及代码示例

    目录 一 数码管介绍 二 数码管引脚定义 我们首先对单个引脚进行说明 其次 我们对多个引脚管进行说明 最后我们来详细说说如何进行位选还有段选 接着是段选 三 数码管段码表 四 数码管驱动方式 五 代码演示 一 数码管介绍 LED数码管 数码
  • 如何启用服务端远程端口

    客户端操作 windows服务端操作 step1 启用远程桌面 step2 检查端口开放情况 或观察防火墙设置 step3 在 命令提示符 窗口中 输入regedit后按键盘回车键 就可以调出注册表了 step4 在 注册表编辑器 左侧栏中
  • scons 实用说明(一)

    还在为写一个makefile发愁吗 还在为难记的make参数而苦恼吗 有了scons一切都边的简单了 最近研究了下scons 发现和makefile相比 soncs编译c和c 程序真的太方便了 搞程序什么做好 当然是简单实用最好下面大家就一