2011-10-29 20 views
0

當我嘗試使用庫編譯我的文件(.a)中,我得到「致命錯誤:URLInputStream.h:沒有這樣的文件或目錄 編譯終止。 '我對C++仍然很陌生,而且這看起來很簡單,但我無法讓它工作。麻煩編譯使用歸檔程序(.a)中

編譯命令我試過:

g++ inc/Downloader.h lib/libcs240utils.a 
g++ inc/Downloader.h -L lib -l cs240utils 
g++ inc/Downloader.h -Llib -lcs240utils 
g++ src/Downloader.cpp -I inc -L lib -l cs240utils 
g++ -c src/Downloader.cpp -I inc -L lib -l cs240utils 

我如何編譯我的檔案:

make lib 
g++ -c -o utils/obj/CommandRunner.o utils/src/CommandRunner.cpp -I utils/inc 
g++ -c -o utils/obj/FileInputStream.o utils/src/FileInputStream.cpp -I utils/inc 
g++ -c -o utils/obj/FileSystem.o utils/src/FileSystem.cpp -I utils/inc 
g++ -c -o utils/obj/HTMLToken.o utils/src/HTMLToken.cpp -I utils/inc 
g++ -c -o utils/obj/HTMLTokenizer.o utils/src/HTMLTokenizer.cpp -I utils/inc 
g++ -c -o utils/obj/HTTPInputStream.o utils/src/HTTPInputStream.cpp -I utils/inc 
g++ -c -o utils/obj/StringUtil.o utils/src/StringUtil.cpp -I utils/inc 
g++ -c -o utils/obj/URLInputStream.o utils/src/URLInputStream.cpp -I utils/inc 
ar cr lib/libcs240utils.a utils/obj/*.o 

存檔似乎是正確建:

ar t lib/libcs240utils.a 

CommandRunner.o 
FileInputStream.o 
FileSystem.o 
HTMLToken.o 
HTMLTokenizer.o 
HTTPInputStream.o 
StringUtil.o 
URLInputStream.o 

我也已經嘗試了ar中的各種選項。如果我指定包含路徑-I utils/inc,那麼它將編譯並正常工作,所以我想要的文件確實正常工作。我在StackOverflow上閱讀過大量的文章和問題,我似乎無法看到我做錯了什麼。 任何想法或建議?

注:我正在編譯一個看起來很奇怪的頭文件。它最初分爲.cpp.h,但爲了簡化問題解決,我將它們合併。同樣的錯誤發生時,他們也分裂以及:g++ src/Downloader.cpp -I inc -L lib -l cs240utils

+0

它抱怨什麼文件?順便說一句,編譯'.h'是不尋常的。 – Mat

+0

添加關於編譯'.h'的註釋。你們似乎陷入了這個問題:問題不在於我正在編譯'.h'文件。當我分裂時,結果是一樣的。 –

+0

它說什麼文件無法找到? .a或.h?你提到「-I utils/inc」使它工作的事實會讓我認爲Downloader.h引用了這個頭文件中的東西。即使在鏈接步驟中包含靜態庫時,仍然需要編譯頭。 – Joe

回答

2

如果Downloader.h仍然可能需要頭文件與類型/類/等。在你的靜態庫中。

你提到「-I utils/inc」使它工作的事實會讓我認爲Downloader.h引用該頭文件中的東西。即使在鏈接步驟中包含靜態庫時,仍然需要編譯頭。

+0

正如編譯命令所描述的那樣:'lib /' –

+0

這似乎並不是我所讀過的。但是,在ar和g ++中有大量的文章,所以很難通過它們進行搜索。你的話我記住了。 –

+0

你有誤讀。 .a文件是榮耀的.o文件集合。您仍然需要標題,就像使用任何其他庫或對象文件一樣。這就是爲什麼世界上的每個庫和SDK都提供對象代碼(通常是.a和/或.so,用於靜態/共享變體)和頭文件以使用它們。 – Joe