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.hadd.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





0 0
原创粉丝点击