scons快速构建c++
来源:互联网 发布:线切割编程软件多大 编辑:程序博客网 时间:2024/06/06 03:10
开通csdn以来一直都是看别人的blog,今天尝试写自己的blog。
scons相对GNU make来说确实是简单了很多,下面就通过对比学习一下scons。
一、使用make编译c++
下面将有两个直接使用g++编译的例子,这两个例子主要是想说明使用g++编译很麻烦。之后我会使用scons完成这两个例子对应的功能。
1.1 生成静态库
//add.h#ifndef MYSQLDIR_ADD_H#define MYSQLDIR_ADD_Hint Add(int a, int b);double Add(double a, double b);#endif
//add.cpp#include "add.h"#include <iostream>using namespace std; int Add(int a, int b){ cout <<"Add(int a, int b)" <<endl; return a + b;}double Add(double a, double b){ cout <<"Add(double a, double b)" <<endl; return a + b;}
上面的代码生成静态库需要如下操作:
(1)g++ -c add.cpp 生成.o文件
(2)ar crv libhello.a add.o 由.o文件创建静态库
经常我会把第二个ar进行归档的指令忘记。
1.2 生成可执行文件
写了一段c++代码,调用mysql-dev库访问数据库:
//文件mysqlc.cpp#include <iostream>#include <mysql.h>#include <my_global.h>int main(){ using namespace std; cout <<mysql_get_client_info() <<endl;}
g++编译结果如下:
g++ mysqlc.cpp mysqlc.cpp:2:19: 致命错误: mysql.h:没有那个文件或目录编译中断。
原因分析:mysql.h 在g++ 默认搜索路径不存在
解决方法:在编译过程中加上 -I/usr/include/mysql 指定搜索路径加入了-I后,继续编译:
g++ mysqlc.cpp -I/usr/include/mysql/tmp/ccsWuiwb.o: In function `main':mysqlc.cpp:(.text+0x5): undefined reference to `mysql_get_client_info'collect2: ld 返回 1
原因分析:虽然指定了头文件,但是函数的实现部分没有找到
解决方法:-L/usr/lib/mysql/ -lmysqlclient 指定lib文件位置,其中-L指定lib库的位置,-l指定lib库名字
这个构建过程麻烦吧。
二、使用scons构建c++
我们继续使用1.1中提到的add.h和add.cpp,使用它们生成静态库,然后我们会写一段c++代码调用静态库的内容,代码如下:
//mysqltest.cpp#include <iostream>#include <mysql.h>#include <my_global.h>#include "add.h"int main(){ using namespace std; cout <<mysql_get_client_info() <<endl; int a = Add(3,5); cout <<"3+5=" <<a <<endl;}
scons的配置文件SConstruct如下:
1 env = Environment() 2 env.StaticLibrary('hello', ['add.cpp']) 3 env.Append(CPPPATH = ['/usr/include/mysql']) 4 env.Program(target = 'mysqlexe', source = ['mysqltest.cpp'], LIBS= ['hello', 'mysqlclient'], LIBPATH= ['/usr/lib/mysql/', '.'])
(1)生成静态库使用第2行的StaticLibrary,简单吧;
(2)生成可执行文件需要mysql.h的搜索路径(使用g++ 的 -I),指定mysql-dev库文件路径和库文件名(使用 -L -l组合)。搜索路径-I的设置需要使用scons的CPPPATH,所以这里都用到了env设置环境变量,第3行就相当于指定了-I搜索路径,第4行的Program是生成可执行文件,LIBS和LIBPATH就相当于-L和-l组合使用。
如果想删除编译过程产生的中间文件(比如.o文件),可以执行scons -c
对比一下scons的内容,感觉与直接使用g++(或者make)比较并没有减少配置内容,其实我觉得scons最方便的地方就在于使你不用苦苦记忆g++的各种复杂配置选项。总的来说,记住scons的配置选项要比g++的选项容易。
三、scons接收输入参数
我们平时在build代码时候,经常需要使用gdb调试,可是使用gdb调试的编译方式我们称为debug编译,否则成为release编译。当然了,大多数人肯定不希望再调整编译方式时修改scons配置文件,此时我们可以使用输入参数,如下:
env = Environment()debug = ARGUMENTS.get('mode', 'release')if debug == 'debug': env['CCFLAGS'] = '-g' print '\n----build in debug mode----\n'else: print '\n----build in release mode----\n'env.Append(CPPPATH = ['include/'])env.Program(target = 'main', source = ['main.cpp', 'conjuncFormConverter.cpp','node.cpp', 'constructNodeTree.cpp'])
这种情况下我们如果我们想使用debug编译方式,可以输入如下指令:
scons mode=debug如果想使用release编译方式,可以输入如下指令:
scons mode=release或者scons
- scons快速构建c++
- 使用 SCons 代替 Makefile 快速构建应用程序
- 使用 SCons 代替 Makefile 快速构建应用程序
- Scons软件构建工具
- scons构建系统
- scons构建入门
- 利用scons构建工程
- RTTHREAD scons构建环境
- 利用scons构建工程
- 快速构建C++项目工具Scons,结合Editplus搭建开发环境
- 用 SCons 构建 SWIG 项目
- 使用scons构建windows程序
- 使用SCons轻松构建程序
- 使用scons构建windows程序
- 使用Scons软件构建工具
- 使用scons软件构建工具
- 使用scons软件构建工具
- rt_thread 采用scons构建系统
- Java异常的面试问题及答案
- 一类监督学习问题
- 绝对路径在不同环境下 到底是相对于什么的绝对
- oracle 最常用的的函数。。
- linux mount
- scons快速构建c++
- OSGI 概述
- java将IP地址转换为数字以及逆向转换(位移和0xFF的使用)
- Java调用DLL动态链接库的JNI方式详解
- 青藤企业社交欲后来居上,企业社交面临洗牌
- 邦弗朗尼原理--出自互联网大规模数据挖掘与分布式处理一书
- Android 打包签名 怎样生成keystore到完成签名
- 111111111111
- 神奇的图像处理算法