【问题标题】:makefile exit with no reason when compile .pc and .c at the same time. very strange同时编译.pc 和.c 时makefile 无故退出。很奇怪
【发布时间】:2016-07-15 16:03:54
【问题描述】:

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

ls connect.pc func.c get_log.pc main.c makefile sql_err.pc


这是我的生成文件:

#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。 当我像这样更改 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.

这个我搞不定,很奇怪,求救!!

【问题讨论】:

    标签: c unix makefile proc


    【解决方案1】:

    默认情况下make 将在您的makefile 中创建第一条规则,但它不能以点开头。因此,您的 makefile 中的默认规则是 libmydb.so,并且正在构建中。

    该规则仅依赖于LIBOBJ,而OBJ 不是依赖项,因此它不关心这些。它不会无缘无故地退出,它退出是因为它完成了你为它定义的工作。没有要报告的错误。

    如果您更改顺序,则默认规则会更改并尝试编译query。这对库没有依赖关系,因此它不会尝试编译它。

    如果您想编译您应该拥有的所有内容,例如,列出依赖项的规则all。在这种情况下,至少按正确的顺序可能是libmydb.soquery。如果这是第一条规则,它将是默认规则,您的编译将成功。

    【讨论】:

    • 非常感谢!这似乎有道理,我稍后会尝试!谢谢!
    • 嗨,打扰一下,请问为什么第二次链接失败,我第一次得到了 libmydb.so。
    • @Hhdzhu 我认为您可能还需要 -brtl 到链接步骤,没有它,链接器可能只会寻找静态库,而不是动态库。虽然不是 AIX 专家。 fixunix.com/aix/493298-linking-so-aix-4-3-a.html 帖子 #4 中提到的内容
    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 2016-01-24
    • 2013-04-26
    • 2013-02-25
    • 2023-01-29
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多