makefile 中的 ESQL INFORMIX 预编译步骤:错误 -33042 无法打开输入文件

ESQL INFORMIX precompilation step in makefile : error -33042 cannot open input file

我必须修改一些非常旧的源代码。它带有一个很长的 Makefile,我一般对 Makefile 不是很熟悉。它还依赖于旧 Informix 服务器的预编译步骤。

我需要修改 Makefile,以便 my_directory 中的源代码可以通过包含 common_src 中的源代码进行编译。

结构如下:

- common_src
- my_directory
   - Makefile

.o 文件应该在 my_directory 内生成。

我有以下内容:

COMMONSRC=$(HOME)/common_src

ESQL=   esql
ESQLFLAGS=  -e

CFLAGS= -DGTKDVPT \
    -I$(INFORMIXDIR)/incl/esql \
    -I$(COMMONSRC)

OFILES= rwfich.o
HFILES= sqlheader.h

COMMON_HFILES=  $(HFILES:%.h=$(COMMONSRC)/%.h)

gcd:        bin/gcd


bin/gcd:    $(LIBGC) gcd.o $(LIBOUTILS)
            @echo -n "Link:     bin/gcd "
            @$(CC) $(CFLAGS) gcd.o $(LIBGC) \
            $(SQLLIBS) $(LNKOPT) -obin/gcd_lnk > gcdlnk.err 2>&1
            @touch bin/gcd
            @mv -f bin/gcd bin/oldgcd
            @mv -f bin/gcd_lnk bin/gcd
            @echo "Ok."

$(LIBGC):   $(RWFOBJ) 
    @echo -n "$(LIBGC)     :    "
    @rm -f $(LIBGC)
    @echo -n "Construction ...  "
    @ar rc $(LIBGC) 
    @echo "Ok."

$(RWFOBJ):  $(OBJDIR)/%.o : $(COMMONSRC)/%.ec $(COMMON_HFILES)
            @echo -n "$<     :  Precompilation  "
            @$(ESQL) $(ESQLFLAGS) $< > $*.err 2>&1
            @echo -n "Compilation  "
            @$(CC) $(CFLAGS) -c $*.c >> $*.err 2>&1
            @rm $*.c
            @echo "Ok."

当我 运行 Makefile 时,它​​到达 $(RWFOBJ)rwfich.ec 的 Informix 重新编译步骤输出的 .err 文件说:esqlc: "/home/my_directory/rwfich.ec", line 7: Error -33042: Cannot open input file 'sqlheader.h'. 1 error(s) found.

有谁知道这有什么问题吗?我什至尝试使用完整路径对 .h 文件进行硬编码:

$(RWFOBJ):  $(OBJDIR)/%.o : $(COMMONSRC)/%.ec $(HOME)/common_src/sqlheader.h

但没有骰子:我得到同样的错误。

非常感谢任何能为我指明正确方向的人。

寻求帮助时,请始终包括您调用的 make 命令和您得到的错误输出,剪切并粘贴到您的问题中(使用正确的格式),而不是解释。错误的确切文本即使是细微的差别也会产生很大的不同。

此外,您的 makefile 不完整,因为您没有向我们展示 RWOBJ 的值是什么,而且您有错字(您定义了 COMMON_HFILES 但您指的是 $(COMMON_HFILE). 因为 make 没有抱怨这个,我假设错字只存在于你的问题中,而不存在于你的实际 makefile 中(这是剪切和粘贴更好的另一个原因)。

另外请包括您使用的操作系统和您使用的 make 版本。

在这种情况下,您收到的“无法打开输入文件”错误不是来自 make,而是来自您的编译器。 Make 能够很好地找到您的头文件,但随后它会调用编译器,而您没有告诉编译器在哪里可以找到头文件。

您需要将 -I$(COMMONSRC) 选项添加到编译行(假设您使用的是 POSIX-ish 编译器,例如 GCC 或 clang)。

您没有提供有关完整 makefile 的足够信息,因此我们无法建议您将该选项放在哪里,但请查看是否有包含其他 -I 选项等的 make 变量。

我通过将 $(CFLAGS) 添加到 Informix 预编译行来解决问题,如下所示:@$(ESQL) $(ESQLFLAGS) $(CFLAGS) $< > $*.err 2>&1,因此总目标如下:

$(RWFOBJ):  $(OBJDIR)/%.o : $(COMMONSRC)/%.ec $(COMMON_HFILES)
        @echo -n "$<     :  Precompilation  "
        @$(ESQL) $(ESQLFLAGS) $(CFLAGS) $< > $*.err 2>&1
        @echo -n "Compilation  "
        @$(CC) $(CFLAGS) -c $*.c >> $*.err 2>&1
        @rm $*.c
        @echo "Ok."