首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用网站管家搭建共享库?

如何使用网站管家搭建共享库?
EN

Stack Overflow用户
提问于 2009-10-20 15:25:15
回答 2查看 7.4K关注 0票数 10

我想使用waf构建一个共享库,因为它看起来比GNU autotools简单得多,也不那么杂乱。

到目前为止,我实际上有几个与我开始编写的wscript相关的问题:

代码语言:javascript
复制
VERSION='0.0.1'
APPNAME='libmylib'

srcdir = '.'
blddir = 'build'

def set_options(opt):
 opt.tool_options('compiler_cc')
 pass

def configure(conf):
 conf.check_tool('compiler_cc')
 conf.env.append_value('CCFLAGS', '-std=gnu99 -Wall -pedantic -ggdb')

def build(bld):
 bld.new_task_gen(
  features = 'cc cshlib',
  source = '*.c',
  target='libmylib')

包含source = '*.c'的行不起作用。我必须指定每个.c文件而不是使用通配符吗?

例如,如何启用调试版本(当前wscript正在使用调试版本CFLAGS,但我希望最终用户可以选择此版本)。

计划将库源代码放在一个子目录中,而使用lib的程序则放在各自的子目录中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-21 15:58:24

假设您使用的是waf的最新版本(在撰写本文时为1.5.9),可以通过构建上下文中的glob()方法指定通配符。因此,您可以编写以下代码:

代码语言:javascript
复制
bld.new_task_gen(
    features = 'cc cshlib',
    source = bld.glob('*.c'),
    target='mylib')

如果您使用的是没有glob的旧版本网站管家,那么有一个方法find_sources_in_dirs可以使用:

代码语言:javascript
复制
lib = bld.new_task_gen(
    features = 'cc cshlib',
    target = 'mylib')
lib.find_sources_in_dirs('.')

此方法仍在Waf中,但已被弃用,并可能最终消失。

srcdirblddir变量现在是可选的,所以您不需要它们-它们缺省为“。和“构建”。你不应该在目标名前面加上" lib“,这是以一种特定于平台的方式自动完成的(在Windows上没有添加lib,共享库使用.dll)。调试与发布构建是一个令人惊讶的棘手问题。最初Waf包含此功能,但它在某个时候被删除了,再也没有重新添加。这是邮件列表上的一个常见请求,因此将来可能会再次出现。同时,你可以做比使用gjc's cflags module更糟糕的事情。只需将其添加到您的项目目录中。最后的wscript将是:

代码语言:javascript
复制
VERSION='0.0.1'
APPNAME='mylib'

def set_options(opt):
    opt.tool_options('compiler_cc')
    opt.tool_options('cflags', tooldir='.')

def configure(conf):
    conf.check_tool('compiler_cc')
    conf.check_tool('cflags', tooldir='.')

def build(bld):
    bld.new_task_gen(
        features = 'cc cshlib',
        source = bld.glob('*.c'),
        target=APPNAME)

要设置调试版本,您需要运行以下命令:

代码语言:javascript
复制
./waf configure -d debug

如果您在自己的子目录中使用库,那么您可能应该有一个顶级的wscript,并使用bld.add_subdirs()技术来添加库/程序目录。每个子目录都有自己的wscript_build文件。然后,您可以使用export_incdirsuselib_local属性在库和程序“模块”之间指定正确的包含目录。

票数 6
EN

Stack Overflow用户

发布于 2018-01-12 23:35:20

waf多年来发生了很大的变化,所以问题中的代码和答案都不再适用于当前的waf。现在你只需要写:

代码语言:javascript
复制
def options(ctx):
    ctx.load('compiler_c')
def configure(ctx):
    ctx.load('compiler_c')
def build(ctx):
    ctx.shlib(source = ctx.path.ant_glob('src/*.c'),
              target = 'name')

注意,网站管家会自动添加lib前缀,这样你就不用写target = 'libname'了。在Windows上,您还必须向shlib函数调用添加defs关键字参数。

就我个人而言,我建议不要使用涉及wscript_build文件的递归构建脚本。并不是说它不能工作(像recursive makefiles一样),只是在一个中等大小的构建脚本中保存所有逻辑要简单得多。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1595450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档