2016-03-28 21 views
0

私はAIXでpro * cを使用しています。.pcファイルを.so libaryにコンパイルします。そしてリンクしてください。これは私のディレクトリです:.pcと.cを同時にコンパイルすると、makefileが理由なく終了します。非常に奇妙な

LS connect.pc func.c get_log.pc main.cのメイク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 [email protected] $(LIBOBJ) $(DBLIB) 
    mv [email protected] $(MYHOME)/lib 

query:$(OBJ) 
    cc -o [email protected] $(OBJ) -L$(MYHOME)/lib -lmydb 
    mv [email protected] $(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 

libmydb.so完了したときに間違ったメッセージが出る!!! 。なぜ??また.oにコンパイルするには私の.cが必要で、最後に実行可能ファイルのクエリリンクlibmydb.soが必要です。私が変更されたときに は、このようなsqueuceは.pc.o.c.oを置く:

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. 

が、私はこれを扱うことができない、非常に奇妙な:私はlibmydb.so最後のステップを持っているが

query:$(OBJ) 
    cc -o [email protected] $(OBJ) -L$(MYHOME)/lib -lmydb 
    mv [email protected] $(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 [email protected] $(LIBOBJ) $(DBLIB) 
    mv [email protected] $(MYHOME)/lib 

それは、このメッセージを与えます、助けて!!

答えて

1

デフォルトでは、makeはメークファイルの最初のルールを作成しますが、ドットで始める必要はありません。したがって、あなたのmakefileのデフォルトルールはlibmydb.soであり、それはビルド中です。

このルールは、LIBOBJにのみ依存し、OBJは依存関係ではありませんので、それらのルールは気にしません。理由なく終了せず、定義したジョブを実行したために終了します。報告するエラーはありません。

注文を変更すると、デフォルトルールが変更され、queryをコンパイルしようとします。これはライブラリに依存しないので、コンパイルしようとはしません。

必要なものをすべてコンパイルする場合は、たとえば、依存関係をリストするルールallを作成します。この場合は、おそらくlibmydb.soqueryが正しい順序であります。これが最初のルールであれば、デフォルトになり、コンパイルは成功します。

+0

ありがとうございました!それは、私はそれを後で試してみましょう!ありがとうございました! – Hhdzhu

+0

こんにちは、私は、2回目のリンクが失敗した理由を尋ねるかもしれません。初めてlibmydb.soを取得しました。 – Hhdzhu

+0

@Hhdzhuリンカーが動的なものではなく静的なライブラリーだけを探すかもし​​れないので、リンクするステップに '-brtl'が必要かもしれないと思います。しかし、AIXの専門家ではない。 http://fixunix.com/aix/493298-linking-so-aix-4-3-a.html投稿#4に記載されているもの –

関連する問題