13

簡単なプログラムをコンパイルしようとしています。

#include <gtkmm.h>

へのパスgtkmm.hはです/usr/include/gtkmm-2.4/gtkmm.h。特に指定しない限り、g++はこのファイルを表示しません-I /usr/include/gtkmm-2.4

私の質問は、g ++で/usr/include、そこに含まれるすべてのヘッダーファイルのすべてのディレクトリを自動的に再帰的に検索するにはどうすればよいですか?これがデフォルトのアクションではないのはなぜですか?

4

3 に答える 3

17

この場合、正しいことは、またはビルドスクリプトで使用することpkg-configですMakefile

# Makefile
ifeq ($(shell pkg-config --modversion gtkmm-2.4),)
  $(error Package gtkmm-2.4 needed to compile)
endif

CXXFLAGS += `pkg-config --cflags gtkmm-2.4`
LDLIBS += `pkg-config --libs gtkmm-2.4`

BINS = program
program_OBJS = a.o b.o c.o

all: $(BINS)

program: $(program_OBJS)
        $(CXX) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $@

# this part is actually optional, since it's covered by gmake's implicit rules
%.o: %.cc
        $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@

あなたが行方不明の場合gtkmm-2.4、これは生成されます

$ make
パッケージgtkmm-2.4がpkg-config検索パスに見つかりませんでした。
おそらく、`gtkmm-2.4.pc'を含むディレクトリを追加する必要があります
PKG_CONFIG_PATH環境変数へ
パッケージ「gtkmm-2.4」が見つかりません
Makefile:3:***コンパイルにはパッケージgtkmm-2.4が必要です。止まる。

そうしないと、すべてを手動で指定しなくても、適切なパスとライブラリがすべて吸い込まれてしまいます。(pkg-config --cflags --libs gtkmm-2.4:の出力を確認してください。これは、手で入力したいよりもはるかに多いです。)

于 2009-02-04T05:17:49.063 に答える
2

メイクファイルを使用していないと思いますか?煩わしい唯一のことは、プログラムをコンパイルするたびに長い -I オプションを入力しなければならないことです。makefile を使用すると、作業がはるかに簡単になります。

たとえば、wikipediaのhello world makefile を次のように変更できます。

INC=-I/usr/include/gtkmm-2.4/

helloworld: helloworld.o
    g++ -o $@ $<

helloworld.o: helloworld.c
    g++ $(INC) -c -o $@ $<

.PHONY: clean

clean:
    rm -f helloworld helloworld.o
于 2009-02-04T05:02:41.123 に答える
0

できません。インクルードパスの全体的なポイントは、必要なものとバージョンを選択できるようにすることです。

あなたにできることは..

#include <gtkmm-2.4/gtkmm.h>

これは同じ効果を達成します。

于 2009-02-04T04:53:11.017 に答える