2009-02-04 30 views
10

Tôi đang cố gắng để biên dịch một chương trình đơn giản, vớig ++ bao gồm tất cả/usr/include đệ quy

#include <gtkmm.h> 

Đường dẫn đến gtkmm.h/usr/include/gtkmm-2.4/gtkmm.h. g ++ không thấy tệp này trừ khi tôi chỉ rõ nó -I /usr/include/gtkmm-2.4.

Câu hỏi của tôi là, làm thế nào tôi có thể có g ++ tự động xem xét đệ quy qua tất cả các thư mục trong /usr/include cho tất cả các tệp tiêu đề chứa trong đó và tại sao đây không phải là hành động mặc định?

Trả lời

16

Trong trường hợp này, những điều đúng để làm là sử dụng pkg-config trong Makefile hoặc bạn buildscripts:

# 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 [email protected] 

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

Nếu bạn đang bỏ lỡ gtkmm-2.4, điều này sẽ tạo ra

0.123.
$ make 
Package gtkmm-2.4 was not found in the pkg-config search path. 
Perhaps you should add the directory containing `gtkmm-2.4.pc' 
to the PKG_CONFIG_PATH environment variable 
No package 'gtkmm-2.4' found 
Makefile:3: *** Package gtkmm-2.4 needed to compile. Stop.

Nếu không, bạn sẽ nhận được tất cả đường dẫn và thư viện thích hợp được hút vào cho bạn, mà không chỉ định tất cả chúng bằng tay. (Kiểm tra đầu ra của pkg-config --cflags --libs gtkmm-2.4: đó là nhiều hơn bạn muốn gõ bằng tay, bao giờ.)

+1

Tôi đoán tôi vừa mới mở ra một nhức đầu hoàn toàn mới để tôi đọc. Được rồi, cám ơn – endeavormac

1

Bạn không thể. Toàn bộ điểm bao gồm đường dẫn là để bạn có thể chọn và chọn những gì bạn muốn và những phiên bản nào.

gì bạn có thể làm là ..

#include <gtkmm-2.4/gtkmm.h> 

nào sẽ đạt được hiệu quả tương tự.

+1

Vấn đề với điều này là gtkmm.h chính nó chỉ bao gồm một loạt các tiêu đề khác với một đường dẫn liên quan đến vị trí của nó mà g ++ không thể tìm .. :/. Nó rất khó chịu. Tôi đoán tôi có thể đi qua và thay thế tất cả các đường dẫn trong gtkmm.h, nhưng tôi hy vọng cho một giải pháp khác. – endeavormac

+0

@endeavormac: biểu mẫu của người thân bao gồm trong gtkmm.h? Về cơ bản, bạn dự kiến ​​sẽ chỉ định thư mục nơi gtkmm.h được tìm thấy qua -I và sau đó nó sẽ hoạt động chính xác. Nếu không có điều đó, nó sẽ không. Dừng hoàn toàn - hoặc thời gian, nếu bạn thích. Tại sao muốn chiến đấu chống lại thiết kế? –

+0

Những gì Jon nói :) –

2

Tôi đoán bạn không sử dụng makefile? Điều duy nhất có thể gây khó chịu là phải nhập tùy chọn -I dài mỗi lần bạn biên dịch chương trình của mình. Một makefile làm cho nó dễ dàng hơn nhiều.

Ví dụ, bạn có thể sửa đổi các hello world makefile từ wikipedia một cái gì đó như sau:

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

helloworld: helloworld.o 
    g++ -o [email protected] $< 

helloworld.o: helloworld.c 
    g++ $(INC) -c -o [email protected] $< 

.PHONY: clean 

clean: 
    rm -f helloworld helloworld.o 
Các vấn đề liên quan