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.am
和configure.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.o
、wpe-we_main.o
和xwe-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 use
AM_CPPFLAGS`,所以我这样做了,这解决了这个问题。
此外,我发现我不需要所有特定于程序的we_CPPFLAGS
、wpe_CPPFLAGS
和xwe_CPPFLAGS
,因为AM_CPPFLAGS
添加到所有程序。
显然,如果 xxx 与其他程序不同,您只需要特定的 xxx_CPPFLAGS
。
很抱歉打扰您了。我希望这可以帮助其他有相同查询的人。
编辑 1: 此更改还删除了相同来源的多个编译。事后看来,这是有道理的:如果xxx_CPPFLAGS
特定于一个程序,那么程序xxx
需要单独编译。如果它们都具有相同的标志,则不再需要。
【讨论】:
以上是关于Autotools:将 -D 与变量一起使用适用于除一个编译之外的所有编译(C 编程)的主要内容,如果未能解决你的问题,请参考以下文章
使用 CORS 与 LocomotiveJs 一起休息 API。适用于本地机器,但不适用于 Amazon 或 Heroku