同时编译.pc 和.c 时,makefile 无故退出。很奇怪
makefile exit with no reason when compile .pc and .c at the same time. very strange
我在 AIX 中使用 pro*c,我想让我的 .pc
文件编译成 .so 库。并且 link 它。这是我的目录:
ls
connect.pc func.c get_log.pc main.c 生成文件 sql_err.pc
这是我的 makefile:
#Makefile
CC = cc -g -brtl
CFLAGS = -g -c
ESQL = proc
RM = rm -f
MYHOME = /home/xxx
OBJ = main.o func.o
LIBOBJ = get_log.o connect.o sql_err.o
DBINC = -I$(ORACLE_HOME)/precomp/public
DBLIB = -L$(ORACLE_HOME)/lib -lclntsh
INCLUDE = -I$(MYHOME)/include
.SUFFIXES: .pc .c .o
.pc.o:
$(ESQL) include=$(MYHOME)/include iname=$*.pc
$(CC) -o $*.o $(CFLAGS) $*.c $(INCLUDE) $(DBINC) $(DBLIB)
$(RM) $*.c
$(RM) $*.lis
libmydb.so:$(LIBOBJ)
$(CC) -qmkshrobj -o $@ $(LIBOBJ) $(DBLIB)
mv $@ $(MYHOME)/lib
query:$(OBJ)
cc -o $@ $(OBJ) -L$(MYHOME)/lib -lmydb
mv $@ $(MYHOME)/bin
func.o:func.c
$(CC) -c $(CFLAGS) $< $(INCLUDE)
main.o:main.c
$(CC) -c $(CFLAGS) $< $(INCLUDE)
clean:
rm -f *.o *.lis
当我做的时候我得到了这个:
.......
cc -g -brtl -o sql_err.o -g -c sql_err.c -I/home/xxx/include -I/oracle/product/10.2.0/precomp/public -L/oracle/product/10.2.0/lib -lclntsh
rm -f sql_err.c
rm -f sql_err.lis
cc -g -brtl -qmkshrobj -o libmydb.so get_log.o connect.o sql_err.o -L/oracle/product/10.2.0/lib -lclntsh
mv libmydb.so /home/xxxlib
当它完成 mv libmydb.so
时,它退出了!!!没有错误 message.why??我还需要我的 .c
编译成 .o
,最后编译成一个可执行文件查询 link libmydb.so
。
当我像这样更改 squeuce 时,将 .c.o
放在 .pc.o
:
之前
query:$(OBJ)
cc -o $@ $(OBJ) -L$(MYHOME)/lib -lmydb
mv $@ $(MYHOME)/bin
func.o:func.c
$(CC) -c $(CFLAGS) $< $(INCLUDE)
main.o:main.c
$(CC) -c $(CFLAGS) $< $(INCLUDE)
.pc.o:
$(ESQL) include=$(MYHOME)/include iname=$*.pc
$(CC) -o $*.o $(CFLAGS) $*.c $(INCLUDE) $(DBINC) $(DBLIB)
$(RM) $*.c
$(RM) $*.lis
libmydb.so:$(LIBOBJ)
$(CC) -qmkshrobj -o $@ $(LIBOBJ) $(DBLIB)
mv $@ $(MYHOME)/lib
它给出了这个消息,虽然我有 libmydb.so 最后一步:
prepaid(wmfe)/home/xxx/src>make
cc -g -brtl -c -g -c main.c -I/home/xxx/include
cc -g -brtl -c -g -c func.c -I/home/xxx/include
cc -o query main.o func.o -L/home/xxx/lib -lmydb
ld: 0706-006 Cannot find or open library file: -l mydb
ld:open(): A file or directory in the path name does not exist.
make: 1254-004 The error code from the last command is 255.
Stop.
我无法处理这个,很奇怪,求助!!
默认情况下 make
将在您的 makefile 中创建第一个规则,但它不能以点开头。因此,您的 makefile 中的默认规则是 libmydb.so
并且正在构建中。
该规则仅依赖于 LIBOBJ
而 OBJ
不是依赖项,因此它不关心这些。它不会无缘无故退出,它退出是因为它已经完成了你为它定义的工作。没有报错。
如果您更改顺序,则默认规则会更改并尝试编译 query
。这与库没有依赖关系,因此它不会尝试编译它。
如果你想编译你应该拥有的一切,例如,一个列出依赖项的规则all
。在这种情况下,可能 libmydb.so
和 query
至少是正确的顺序。如果这是第一条规则,它将是默认规则,您的编译将成功。
我在 AIX 中使用 pro*c,我想让我的 .pc
文件编译成 .so 库。并且 link 它。这是我的目录:
ls connect.pc func.c get_log.pc main.c 生成文件 sql_err.pc
这是我的 makefile:
#Makefile
CC = cc -g -brtl
CFLAGS = -g -c
ESQL = proc
RM = rm -f
MYHOME = /home/xxx
OBJ = main.o func.o
LIBOBJ = get_log.o connect.o sql_err.o
DBINC = -I$(ORACLE_HOME)/precomp/public
DBLIB = -L$(ORACLE_HOME)/lib -lclntsh
INCLUDE = -I$(MYHOME)/include
.SUFFIXES: .pc .c .o
.pc.o:
$(ESQL) include=$(MYHOME)/include iname=$*.pc
$(CC) -o $*.o $(CFLAGS) $*.c $(INCLUDE) $(DBINC) $(DBLIB)
$(RM) $*.c
$(RM) $*.lis
libmydb.so:$(LIBOBJ)
$(CC) -qmkshrobj -o $@ $(LIBOBJ) $(DBLIB)
mv $@ $(MYHOME)/lib
query:$(OBJ)
cc -o $@ $(OBJ) -L$(MYHOME)/lib -lmydb
mv $@ $(MYHOME)/bin
func.o:func.c
$(CC) -c $(CFLAGS) $< $(INCLUDE)
main.o:main.c
$(CC) -c $(CFLAGS) $< $(INCLUDE)
clean:
rm -f *.o *.lis
当我做的时候我得到了这个:
.......
cc -g -brtl -o sql_err.o -g -c sql_err.c -I/home/xxx/include -I/oracle/product/10.2.0/precomp/public -L/oracle/product/10.2.0/lib -lclntsh
rm -f sql_err.c
rm -f sql_err.lis
cc -g -brtl -qmkshrobj -o libmydb.so get_log.o connect.o sql_err.o -L/oracle/product/10.2.0/lib -lclntsh
mv libmydb.so /home/xxxlib
当它完成 mv libmydb.so
时,它退出了!!!没有错误 message.why??我还需要我的 .c
编译成 .o
,最后编译成一个可执行文件查询 link libmydb.so
。
当我像这样更改 squeuce 时,将 .c.o
放在 .pc.o
:
query:$(OBJ)
cc -o $@ $(OBJ) -L$(MYHOME)/lib -lmydb
mv $@ $(MYHOME)/bin
func.o:func.c
$(CC) -c $(CFLAGS) $< $(INCLUDE)
main.o:main.c
$(CC) -c $(CFLAGS) $< $(INCLUDE)
.pc.o:
$(ESQL) include=$(MYHOME)/include iname=$*.pc
$(CC) -o $*.o $(CFLAGS) $*.c $(INCLUDE) $(DBINC) $(DBLIB)
$(RM) $*.c
$(RM) $*.lis
libmydb.so:$(LIBOBJ)
$(CC) -qmkshrobj -o $@ $(LIBOBJ) $(DBLIB)
mv $@ $(MYHOME)/lib
它给出了这个消息,虽然我有 libmydb.so 最后一步:
prepaid(wmfe)/home/xxx/src>make
cc -g -brtl -c -g -c main.c -I/home/xxx/include
cc -g -brtl -c -g -c func.c -I/home/xxx/include
cc -o query main.o func.o -L/home/xxx/lib -lmydb
ld: 0706-006 Cannot find or open library file: -l mydb
ld:open(): A file or directory in the path name does not exist.
make: 1254-004 The error code from the last command is 255.
Stop.
我无法处理这个,很奇怪,求助!!
默认情况下 make
将在您的 makefile 中创建第一个规则,但它不能以点开头。因此,您的 makefile 中的默认规则是 libmydb.so
并且正在构建中。
该规则仅依赖于 LIBOBJ
而 OBJ
不是依赖项,因此它不关心这些。它不会无缘无故退出,它退出是因为它已经完成了你为它定义的工作。没有报错。
如果您更改顺序,则默认规则会更改并尝试编译 query
。这与库没有依赖关系,因此它不会尝试编译它。
如果你想编译你应该拥有的一切,例如,一个列出依赖项的规则all
。在这种情况下,可能 libmydb.so
和 query
至少是正确的顺序。如果这是第一条规则,它将是默认规则,您的编译将成功。