0

C++ にかなり慣れていないので、基本的に g++ コンパイラ、特にライブラリの組み込みについて質問があります。次のメイクファイルを検討してください。

CPPFLAGS= -I libraries/boost_1_43_0-bin/include/ -I libraries/jpeg-8b-bin/include/
LDLIBS= libraries/jpeg-8b-bin/lib/libjpeg.a
# LDLIBS= -L libraries/jpeg-8b-bin/lib -llibjpeg

all: main

main: main.o
    c++ -o main main.o $(LDLIBS)

main.o: main.cpp
    c++ $(CPPFLAGS) -c main.cpp

clean:
    rm -rf *.o main

ご覧のとおり、LDLIBS 変数を 2 回宣言しました。上記のメイクファイルを使用すると、コードがコンパイルされて機能します。しかし、最初の LDLIBS エントリを非アクティブにし、2 番目のエントリをアクティブにすると、ld: library not found for -llibjpeg. 私の名前libjpeg.aは呼ばれていないだけでlibjpeg、別の名前が付いていると思います。

特定の「ライブラリファイル」の名前を見つける方法はありますlibsomething.alibsomething.dyn?


わかりました、すべての回答に感謝します。現在は機能しています。1 つだけ疑問が残ります。単に「lib」を除外するのは慣例なのか、それとも名前を見つけるための標準化された方法があるのか​​ということです。

4

3 に答える 3

10

スイッチlibを使用する場合は必要ありません。-l

LDLIBS=-Llibraries/jpeg-8b-bin/lib -ljpeg
#                                    ^^^^

を記述するたびに、リンカは指定されたすべてのライブラリ パス-lxxxでファイル名を持つライブラリを探します。libxxx.<ext>これは の標準規則でありld、ほとんどの UNIX ベースのリンカに当てはまります。

于 2010-05-26T08:40:50.767 に答える
3

通常、LDLIBS 宣言の 2 番目の形式を使用する場合、-ljpeg を取得するには、-llibjpeg の lib の文字を削除する必要があります。

于 2010-05-26T08:40:52.807 に答える
3

-I または -L とそれに続くパスの間にスペースはなく、-lxxx は lib を意味するため、

-Llibraries/jpeg-8b-bin/lib -ljpeg

トリックを行う必要があります。

于 2010-05-26T08:47:31.877 に答える