2010-11-25 8 views
1

は私のMakefileです:Makefileでこのリンクの問題を解決するには?ここ

DIR=.. 
ARG=$(QUERY_STRING) 

MAIN=main 

SRC_DIR=$(DIR)/src 
BIN_DIR=$(DIR)/bin 
INC_DIR=$(DIR)/inc 
LIB_DIR=$(DIR)/lib 

LIBS=markdown 

all: $(MAIN) exec 


$(MAIN): $(MAIN).o 
    $(LD) $^ -L $(LIB_DIR) -l $(LIBS) -o $(BIN_DIR)/[email protected] 

$(MAIN).o: $(SRC_DIR)/$(MAIN).c 
    $(CC) $^ -I $(INC_DIR) -o [email protected] 

exec: 
    $(BIN_DIR)/$(MAIN) $(ARG) 

clean: 
    rm -f *.o core.* $(BIN)/$(MAIN) 

明らかに私のプロジェクトの編成方法を定義していますので、私はそれを説明しません。それは何の問題もなくコンパイルんが、バイナリ実行$(BIN_DIR)/$(MAIN)に次のエラーが表示されます

../bin/main: error while loading shared libraries: rintf: cannot open shared object file: No such file or directory 
make: *** [exec] Error 127 

rintfは何のライブラリに属していますか?私は-lcもリンクしようとしましたが、それでも問題は解決しません。

私のMakefileに問題がありますか?または、$(MAIN)に余分なものをリンクする必要がありますか?

ご回答いただきありがとうございます。

答えて

3

本質的には、直接ldを呼び出すことによってプログラムをリンクする必要はありません。常にコンパイラを使用してリンクを行います。これは、すべての種類の追加の引数をldに渡して、動作させる。 $(LD)$(CC)に置き換えます。実際に問題を解決するかどうかにかかわらず、それを行います。

'エラーメッセージで指定された共有オブジェクトの名前が取得できません。

このマニュアルページのrintf()は、<math.h>で宣言されています。おそらく、数学ライブラリをリンク行に追加する必要があります:-lm

私はあなたのメイクファイルの一部を書き換えます:

LIB1 = -lmarkdown 
LIB2 = -lm 
LIBS = $(LIB1) $(LIB2) 
LDFLAGS = -L $(LIB_DIR) 

... 

$(MAIN): $(MAIN).o 
    $(CC) $^ $(LDFLAGS) $(LIBS) -o $(BIN_DIR)/[email protected] 
+2

+1を。また、 'all:$(MAIN)exec'ルールは賢明ではありません。 Makeは、左から右の順にターゲットの前提条件を構築することを約束していません。より良い: 'all:exec'と' exec:$(MAIN) 'です。 – Beta

+0

@Beta:はい、そうです。個人的には、ビルドされたプログラムを自動的に実行するmakefileは特に好きではありませんが、それは古いかわいそうな考えかもしれません。それは部分的に実行が何をするかに依存します。単体テストや回帰テストは理にかなっています - それはおそらくここにあります。そして、私はオフィスでやった仕事からたくさんの反例を持っています。 –

1

通常、このエラーは、リンカーが必要な共有オブジェクト(.soファイル)を見つけることができない場合に表示されます。Linuxプラットフォームを想定しています。

Linux OSでは、findまたはlocateを使用してファイルを検索できます。 .soファイルが見つかる場合は、ldconfigを使用してリンカーキャッシュを更新してください。動作しない場合は、/etc/ld.conf.d/のリンカー設定ファイルを調べて、ライブラリパスが含まれているかどうかを確認してください。設定を変更した場合は、キャッシュを再度更新することを忘れないでください!

関連する問題