Autotools:将 -D 与变量一起使用适用于除一个编译之外的所有编译(C 编程)

Posted

技术标签:

【中文标题】Autotools:将 -D 与变量一起使用适用于除一个编译之外的所有编译(C 编程)【英文标题】:Autotools: using -D with variable works for all but one compile (C programming) 【发布时间】:2017-07-08 06:43:18 【问题描述】:

我正在将带有手写Makefile.in(当然还有configure.in)的旧自动工具设置转换为最新的(Makefile.amconfigure.ac)。到目前为止,一切看起来都很好,但我遇到了一些我无法在其他问题中找到答案的问题。

我在Makefile.am 中添加了一个定义,它包含在我在_SOURCES 中指出的所有c 模块的编译中,但只有一个。我认为 c 源代码之间完全没有区别,除了编译中不包含定义的那个是程序的主要部分。

Makefile.am(相关部分)的代码下方:

bin_PROGRAMS = wpe we 
lib_LTLIBRARIES = libxwpe-x11.la libxwpe-term.la
libxwpe_x11_la_SOURCES = we_xterm.c WeXterm.c
libxwpe_x11_la_CPPFLAGS = -DLIBRARY_DIR=\"@libdir@/xwpe\"
libxwpe_term_la_SOURCES = we_term.c
libxwpe_term_la_CPPFLAGS = -DLIBRARY_DIR=\"@libdir@/xwpe\"
wpe_SOURCES =   we_main.c we_block.c we_unix.c we_e_aus.c \
        we_edit.c we_fl_fkt.c we_fl_unix.c we_hfkt.c \
        we_menue.c we_mouse.c we_opt.c we_wind.c \
        we_prog.c we_progn.c we_debug.c WeString.c \
        WeSyntax.c WeExpArr.c WeLinux.c we_gpm.c 
wpe_LDADD = libxwpe-x11.la libxwpe-term.la
wpe_CPPFLAGS = -DLIBRARY_DIR=\"@libdir@/xwpe\"
we_SOURCES =    we_main.c we_block.c we_unix.c we_e_aus.c \
        we_edit.c we_fl_fkt.c we_fl_unix.c we_hfkt.c \
        we_menue.c we_mouse.c we_opt.c we_wind.c \
        we_prog.c we_progn.c we_debug.c WeString.c \
        WeSyntax.c WeExpArr.c WeLinux.c we_gpm.c 

编译的结果是所有c源都是用LIBRARY_DIR的define编译的,除了we_main.c没有这个define编译。

有谁知道是什么导致了这种差异?我究竟做错了什么?我不应该定义wpe_CPPFLAGS 而是定义其他标志吗?

编辑 1: 查看 Makefile,我注意到它编译了 we_main 多次!它创建we-we_main.owpe-we_main.oxwe-we_main.o。这些文件都编译正确,但我唯一不明白的是we_main.o的编译,它是在没有定义的情况下编译的。看起来我错过了我应该定义的标志。可能我误解了 Makefile.am 中的 automake 输入。我应该定义一个额外的标志吗?如果有,是哪一个?

编辑 2: 多次编译似乎有点浪费。我是自动工具的新手,所以可能有更好的解决方案。如有必要,我会就此主题提出不同的问题。

【问题讨论】:

对于在多个目标的依赖项中列出的那些源,您有多个编译,其中这些目标具有每个目标的编译选项。这可确保根据为该目标指定的选项为每个目标构建此类源。在您的特定情况下,Automake 对是否有必要的相当简单的测试过于保守,但在其他情况下它是最好的,例如在配置甚至构建时间之前不知道必要的选项时。 @JohnBollinger 谢谢,我终于明白了。尽管如此,看到多个编译引导我使用 AM_CPPFLAGS 而不是每个程序标志。现在我对 autoools 有了更好的了解。显然奇怪的东西可以让你走上正轨! 【参考方案1】:

通过EDIT 1 的观察,我找到了答案。首先我使用了CPPFLAGS = -DLIBRARY_DIR=\"@libdir@/xwpe\".autoreconfwarned me to better useAM_CPPFLAGS`,所以我这样做了,这解决了这个问题。

此外,我发现我不需要所有特定于程序的we_CPPFLAGSwpe_CPPFLAGSxwe_CPPFLAGS,因为AM_CPPFLAGS 添加到所有程序。

显然,如果 xxx 与其他程序不同,您只需要特定的 xxx_CPPFLAGS

很抱歉打扰您了。我希望这可以帮助其他有相同查询的人。

编辑 1: 此更改还删除了相同来源的多个编译。事后看来,这是有道理的:如果xxx_CPPFLAGS 特定于一个程序,那么程序xxx 需要单独编译。如果它们都具有相同的标志,则不再需要。

【讨论】:

以上是关于Autotools:将 -D 与变量一起使用适用于除一个编译之外的所有编译(C 编程)的主要内容,如果未能解决你的问题,请参考以下文章

Linux autotools有啥用

使用 CORS 与 LocomotiveJs 一起休息 API。适用于本地机器,但不适用于 Amazon 或 Heroku

UIButton 约束失败,但适用于 UILabel

parent.navigate 仅适用于 IE。我必须有啥替代方法才能使其与其他浏览器一起使用?

.net 将 API 与不同的目标框架结合在一起

学业总结