如何使用scons构建工程,请参考快速构建C++项目工具Scons,结合Editplus搭建开发环境。
编译SharedLibrary项目的时候,生产的so文件时自动加上lib, 例如:
env = Environment()
env.SharedLibrary('hello', sources=['hello.c'])
将以上保存成build.py, 执行编译命令
scons -f build.py
生成动态库so的文件名 libhello.so。这样做的好处,自然不用多说。这种lib前缀并不适合所有情况,写这个随笔的也是因为遇到不需要lib前缀的情况。
参考网上写了一个c的python模块,按照模块的规则,动态库的入口函数必须是"init+模块名",自然生成的动态库也必须跟模块名一致,scons的SharedLibrary构建工具生成的文件名自然就多了个“lib”前缀,例如: libhello.so。 python脚本文件import hello语法就会出错。
找了很多文章都是教程,只能把scons的源码翻了一下,找到$SHLIBPREFIX这个scons环境变量,使用env的Dump方法查看这个环境变量
env = Environment()
print env.Dump()
[root@A xxx]# scons -f hello.py |grep LIBPREFIX
'LDMODULEPREFIX': '$SHLIBPREFIX',
'LIBPREFIX': 'lib',
'LIBPREFIXES': ['$LIBPREFIX'],
'SHLIBPREFIX': '$LIBPREFIX',
'_LIBFLAGS': '${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}',
[root@A xxx]#
蓝色字体就是env里面的默认设置,修改方法也就简单了
env = Environment(SHLIBPREFIX='')
至此动态库默认前缀lib被去掉了。