2016-08-04 91 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宏使用相对路径,但它从不解释如何使用它。 –