2010-03-23 41 views
9

我只是用MAC端口(須藤安裝GD2),其安裝在以下地方庫安裝GD2:設置庫包括在C++中的路徑

/opt/local/include/gd.h 
/opt/local/lib/libgd.dylib (link) 
/opt/local/lib/libgd.la 
/opt/local/lib/libgd.a 

這裏是我的make文件也:

dev: main.o 
    g++ -L/opt/local/lib -I/opt/local/include -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap 

main.o: main.cpp 
    g++ -c main.cpp 

所以,當我創建我的C++程序,我加上「#包括‘gd.h’」,會拋出:

main.cpp:4:16: error: gd.h: No such file or directory 

如果我設置gd.h絕對路徑(同上)(不是一個解決辦法,但很好奇),我拋出:

g++ -L/opt/local/include -L/opt/local/lib main.o -o heatmap 
Undefined symbols: 
    "_gdImagePng", referenced from: 
     _main in main.o 
    "_gdImageLine", referenced from: 
     _main in main.o 
    "_gdImageColorAllocate", referenced from: 
     _main in main.o 
     _main in main.o 
    "_gdImageDestroy", referenced from: 
     _main in main.o 
    "_gdImageCreate", referenced from: 
     _main in main.o 
    "_gdImageJpeg", referenced from: 
     _main in main.o 
ld: symbol(s) not found 

所以,我明白這意味着LD無法找到其所需的庫(因此試圖給它暗示了「 -L「值)。因此,在給g ++ -L提示和#include中的絕對路徑之後,我可以讓它工作,但我不認爲我必須這樣做,我該如何讓g ++/ld search int eh適合庫的位置?

德魯J.索內。

PS。使用: - OSX 10.6.2 - gcc版本4.2.1(蘋果公司建立5646)(點1)

編輯: 好了,所以考慮到stfanB和邁克爾的回答後,我重新編譯GD到本地目錄(libraries),因此,我已經改變了我的Makefile文件的第一行(我將高清退房的cmake)來g++ -L./libraries/lib -I./libraries/include -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap 但我仍然得到main.cpp:3:16: error: gd.h: No such file or directory

編輯: 感謝所有的答案,這裏是我最後的(工作)makefile文件給其他許多人想要答案的人:

dev: main.o 
    g++ -I./libraries/include -L./libraries/lib -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap 

main.o: main.cpp 
    g++ -I./libraries/include -c main.cpp 

回答

14

我強烈建議您不要直接調用g ++,而應該使用CMake(如果您想了解更多信息,請參閱CMake Google Techtalk),因爲這會讓您的生活更輕鬆,並且可以大大簡化對各種庫的定位和鏈接。也就是說,我相信你調用的問題是你沒有指定庫,你會用-lgd來做。你的-L/opt/local/lib正確地告訴g ++看/opt/local/lib,但你從來沒有告訴它尋找什麼。至於找到合適的標題,您可以使用-I/opt/local/include/opt/local/include置於編譯器的包含搜索路徑中。

如果你聽從我的建議使用CMake的,這樣做看起來像:

 
FIND_PACKAGE(GD2 REQUIRED) 
INCLUDE_DIRECTORIES(${GD2_INCLUDE_DIRS}) 
LINK_DIRECTORIES(${GD2_LIBRARY_DIRS}) 

ADD_EXECUTABLE(heatmap main Heatmap_Map Heatmap_Point) 
TARGET_LINK_LIBRARIES(heatmap ${GD2_LIBRARIES}) 

如果您有興趣瞭解更多關於CMake的,你可能想看看C++ Application Project TemplateC++ Library Project Template ,它使用CMake構建系統。 CMake可以通過MacPorts通過命令「sudo port install cmake」獲得。

如果你不感興趣的安裝CMake的,我也應該指出的是,也有一些環境變量,你可能有興趣知道有關使您的生活更輕鬆,即:

  • CPATH
  • LIBRARY_PATH
  • DYLD_FALLBACK_LIBRARY_PATH

的CPATH環境變量很像PATH環境變量(它是一個冒號分隔的列表ö f目錄),除了該變量中的目錄將自動由gcc和g ++使用,就好像它們在命令行上用-I標誌指定的一樣。標題將在這些路徑中進行搜索)。 LIBRARY_PATH是相同的,除了它好像文件夾是用-L(即庫自動在該路徑中搜索)給出的。 DYLD_FALLBACK_LIBRARY_PATH將被動態鏈接器使用(所以你應該包含從LIBRARY_PATH到這個變量的路徑)。

您可以在鏈接中閱讀關於environment variables affecting gcc的更多信息。

+0

我最近一直在使用JamPlus,非常喜歡它。 – 2010-03-23 01:47:14

1

頭文件包含的目錄需要用-I選項指定(只有在此之後需要相對路徑)並且鏈接程序包含帶有-L的目錄(這裏也是相對路徑)。

對於庫,您可以選擇另一種方法設置LD_LIBRARY_PATH,但-L方法更安全。

+1

@Sameer,他正確使用了-L標誌,但忘了用-l指定一個庫。 – 2010-03-23 01:49:18

3

答案相當複雜。

簡短的回答,因爲你或/usr/local/lib/usr/local/include甚至~/local/lib~/local/include以上使用,始終這些添加到您的編譯器/連接時,您編譯自己的庫/工具,將它們放置在一些local目錄等。

更長的回答 - 閱讀Programming Library HOWTO Linux解釋每個涉及的工具從編譯器/鏈接器到執行,看看標準的directory structure of Linux system這當然沒有約束力,但很高興知道。

我假設你有一個簡單的Makefile設置爲你的每個項目,所以你不必打擾所有這些命令。如果你不這樣做,我強烈建議設置一個簡單的Makefile模板,以便你的項目可以重複使用。

編輯

在你編輯的回答你的路可能不正確。

您的路徑中的../libraries指定當前目錄,這意味着它將查看當前目錄中的libraries目錄。如果您在根目錄彪libraries目錄,然後刪除.所以它應該是這樣的-L/libraries/lib,同樣爲-I/libraries/...

+0

@邁克爾好像他從其他答案中學到了一些東西,所以其他答案可能並不像你想象的那樣完全不相關。 – stefanB 2010-03-23 02:07:22

+0

@邁克爾,你明白了,但是斯蒂芬的權利,我得到了更多的其他答案。 ;-) @stefanB,是的,我把它放在我的項目目錄中。 – Drew 2010-03-23 02:12:04

+0

我很高興我們都能夠幫助你...點不重要 – stefanB 2010-03-23 02:16:56

1

我認爲你的問題可能是您的-I參數需要傳遞給編譯階段了。也許這樣?

dev: main.o 
    g++ -L/opt/local/lib -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap 

main.o: main.cpp 
    g++ -I/opt/local/include -c main.cpp 

不sure-我沒有在20年內用於生成文件(但正如我在另一個帖子的評論中提到,我覺得JamPlus在它的功率相當出色)。

無論如何 - 通常你的編譯器和鏈接器標誌將被放入變量中,然後在命令行中進行擴展,但是我不確定它的make語法。也許簡單地說:

CFLAGS=-I/opt/local/include 
LINKFLAGS=-L/opt/local/lib -lgd -lpng -lz -ljpeg -lfreetype -lm 

dev: main.o 
    g++ $(LINKFLAGS) main.o -o heatmap 

main.o: main.cpp 
    g++ $(CFLAGS) -c main.cpp 
+0

@ dash-tom-bang,FYI,CXXFLAGS通常用於C++設置,而LDFLAGS用於鏈接器標誌。您應該使用預定義變量$(CXX)作爲C++編譯器,而不是在g ++中進行硬編碼。另外,main.o:main.cpp是自動定義的。將main.o指定爲依賴關係足以使Make使用默認的C++編譯器自動編譯main.cpp,並使用CXXFLAGS中指定的任何設置。 – 2010-03-23 02:18:07

+0

@Michael謝謝。 – 2010-03-23 19:13:09