使用scons替代makefile(2)

本篇文章接着上一篇进一步介绍scons的使用方法,主要介绍静态库和动态库的编译

在scons里编译库文件和编译可执行程序非常类似,只是采用的指令有所不同。

对于静态库,采用如下指令

Library(”libdemo”,["a.c","b.c"])或者StaticLibrary(”libdemo”,["a.c","b.c"])

对于动态库,采用如下指令

SharedLibrary(”libdemo”,["a.c","b.c"])

下面来看一个最简单的例子吧,假如有两个源文件a.c和b.c,内容分别如下

a.c中定义了函数demo_a

[leconte@localhost demolib]$ cat a.c
#include <stdio.h>
void demo_a(char* s)
{
    printf("%s/n",s);
}

b.c中定义了函数demo_b

[leconte@localhost demolib]$ cat b.c
#include <stdio.h>
void demo_b()
{
    printf("hello world/n");
}

在同一个目录下编写Sconstruct文件,编译静态库libdemo.a

[leconte@localhost demolib]$ cat SConstruct
Library("libdemo",["a.c","b.c"])

然后进行编译

[leconte@localhost demolib]$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o a.o -c a.c
gcc -o b.o -c b.c
ar rc libdemo.a a.o b.o
ranlib libdemo.a
scons: done building targets.

编译过程中会生成各自的目标文件a.o和b.o,然后直接打包为静态库libdemo.a。

接下来仍然用a.c和b.c来编译动态库libdemo.so

修改Sconstruct内容为

[leconte@localhost demolib]$ cat SConstruct
SharedLibrary("libdemo",["a.c","b.c"])

执行scons,过程如下

[leconte@localhost demolib]$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o a.os -c -fPIC a.c
gcc -o b.os -c -fPIC b.c
gcc -o libdemo.so -shared a.os b.os
scons: done building targets.

它会首先生成位置无关的目标文件a.os和b.os,然后再生成动态库libdemo.so

[leconte@localhost demolib]$ ldd libdemo.so
        linux-gate.so.1 =>  (0x0019a000)
        libc.so.6 => /lib/libc.so.6 (0x00e04000)
        /lib/ld-linux.so.2 (0x00252000)

OK,下面的问题就是如何使用动态库或者静态库了,编写一个简单的程序main.c,内容如下

#include <stdio.h>
void demo_a(char* s);
void demo_b();
 
int main()
{
    demo_b();
    demo_a("www.linuxers.cn");
}

在之前的Sconstruct中加入一行,生成demo程序,它依赖libdemo.a静态库

Library("libdemo",["a.c","b.c"])
Program("demo","main.c",LIBS=["demo"],LIBPATH=["."]);

在Sconstruct中需要用LIBS指令指定需要链接的库,用LIBPATH指定库位置

编译并执行过程如下

[leconte@localhost demolib]$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o a.o -c a.c
gcc -o b.o -c b.c
gcc -o main.o -c main.c
ar rc libdemo.a a.o b.o
ranlib libdemo.a
gcc -o demo main.o -L. -ldemo
scons: done building targets.
[leconte@localhost demolib]$ ./demo
hello world
www.linuxers.cn

scons最基本的编译库和使用库的方式就是这样,很容易将这种方式扩展到你的项目中。

当然,实际项目中不可缺少的一点是多目录编译,这一点上scons类似于makefile,都有包含机制。

具体例子如下

[leconte@localhost demolib]$ cat SConstruct
SConscript(['test1/SConscript',
    'test2/SConscript',
    'test3/SConscript',
    'test4/SConscript'])

编译过程中,会自动编译 test1~test4目录下的源文件,当然具体的编译过程依赖于各自目录下的Sconstruct文件

 

源文档 <http://hi.baidu.com/jrckkyy/blog/item/73645b50e27b514c1138c222.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于使用QNX操作系统的Qt项目,可以使用SCons作为构建工具。SCons是一种基于Python的构建工具,可以自动化构建和测试过程,提高项目开发效率。 以下是使用SCons编译Qt项目的基本步骤: 1. 安装SCons 在QNX操作系统上,可以使用pkgsrc安装SCons。在终端中输入以下命令: ``` pkgin update pkgin install scons ``` 2. 配置SCons 在Qt项目的根目录下创建一个SConstruct文件,并添加以下内容: ``` import os # Set up environment variables env = Environment() env.Append(CPPPATH=['/usr/include/qt']) # Set up Qt libraries and modules env.Append(LIBS=['QtCore', 'QtGui', 'QtNetwork', 'QtXml', 'QtSql', 'QtSvg']) env.Append(QTDIR='/usr/local/Trolltech/Qt-4.8.7') # Set up compiler and linker flags env.Append(CCFLAGS=['-Wall', '-Werror']) env.Append(LINKFLAGS=['-Wl,-rpath-link,/usr/local/Trolltech/Qt-4.8.7/lib']) # Compile and link the project env.Program(target='myproject', source=['main.cpp', 'myclass.cpp']) ``` 在上面的代码中,我们设置了环境变量,包括Qt的头文件路径、库文件路径和Qt安装路径。然后,我们添加了需要链接的Qt库,设置编译器和链接器的参数,最后编译并链接项目。 3. 运行SCons 在终端中进入项目根目录,运行以下命令: ``` scons ``` 这将会自动编译和链接项目,并生成可执行文件。 注意:在运行SCons之前,需要确保Qt已经正确安装并配置好。如果Qt库文件没有正确设置,可能会出现链接错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值