2016-08-04 90 views
0

我最近一直在試圖在Mac上編寫一個opengl程序,並將其作爲控制檯應用程序部署並分發給其他Mac用戶。G ++:鏈接動態(dylib)庫

由於該程序是用C++編寫的,我決定使用g ++。我的程序需要使用OpenGL框架,GLFW和GLEW。我的/ usr/local/lib文件夾中有GLFW和GLEW庫,我的/ usr/local/include文件夾中有頭文件。我的主文件叫做main.cpp。 GLFW動態加載庫稱爲libglfw.3.2.dylib,GLEW動態加載庫稱爲libGLEW.2.0.0.dylib。

當我編譯使用下面的命令從所述的main.cpp文件的目錄以g ++:

g++ -arch x86_64 -framework OpenGL -I/usr/local/include -L/usr/local/lib -o Main main.cpp -lglfw.3.2 -lGLEW.2.0.0 

一切正確編譯和程序運行。

但是,這通過絕對路徑鏈接庫:/ usr/local/lib。這意味着當我將可執行文件移動到另一臺計算機時,它不會運行。我需要在每臺計算機上加載dylib。所以,我想將它們移動到有我的main.cpp文件的文件夾,並使用$(CURDIR)鏈接到我的當前目錄:

g++ -arch x86_64 -framework OpenGL -I/usr/local/include -L'$(CURDIR)' -o Main main.cpp -lglfw.3.2 -lGLEW.2.0.0 

這不起作用,因爲由於某種原因,它似乎並沒有認識到「$ (CURDIR)'作爲當前目錄,或者它可能不是一個有效的變量。

我正在尋找一種方法來鏈接我的dylibs,以便我可以將我的可執行文件移動到任何計算機並使其工作。

任何幫助,將不勝感激。

+0

它以什麼方式不起作用? –

+0

它根本無法將路徑識別爲當前目錄的路徑。 –

+0

不確定,但嘗試從-L'$(CURDIR)'中刪除引號。在我的MSYS shell(在Windows上),如果我留下引號,它似乎不會擴展變量(至少使用回顯)。也嘗試刪除括號。 –

回答

0

-L給出的路徑僅供鏈接器查找多餘的庫。這些庫位於運行時的位置不受-L的控制。相反,你應該看看rpath。有一篇關於如何在MacOS X上正確執行的文章:https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/RunpathDependentLibraries.html

+0

我試過以下內容:g ++ -arch x86_64 -framework OpenGL -I/usr/local/include -Wl,-rpath,'$ ORIGIN' -o main main.cpp libglfw.3.2.dylib libGLEW.2.0.0.dylib。它編譯正確,但只要我將文件夾移動到另一個mac,我遇到了和以前一樣的問題。 –

+0

@OrrenRavid:請閱讀我在答案中給出的鏈接。 rpaths在MacOS中的工作方式不同(Apple強烈要求NIH),不要使用'$ ORIGIN'變量,而是擴展'@ rpath'宏。 – datenwolf

+0

沒有關於如何在編譯器中使用它的解釋,它只解釋了存在@rpath宏使用相對路徑,但它從不解釋如何使用它。 –