我在AIX中使用pro * c,我想将我的.pc文件编译为.so库。并将其链接。这是我的目录:

ls
    connect.pc func.c get_log.pc main.c makefile 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时,它退出!没有错误消息。为什么?我还需要将.c编译为.o,最后编译为可执行文件查询链接libmydb.so
当我像这样更改挤压时,将.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.soquery至少应以正确的顺序排列。如果这是第一条规则,它将是默认规则,并且编译将成功。

关于c - 当同时编译.pc和.c时,makefile没有理由退出。很奇怪,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36261613/

10-09 15:50
查看更多