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."
我必须修改一些非常旧的源代码。它带有一个很长的 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."