2015-06-25 23 views
2

我正试图编译一个简单的C++测试程序,在macintosh 10.9.5上用012ng和clang ++ 5.1编译。在mac上gnu/clang编译器中定义相对于可执行文件的框架路径

我想了解如何在gnu/clang中手动编译框架,所以请避免需要Xcode的答案。


项目布局

Project/ 
| 
|-- Output/ 
| |-- <Unix Executable File> 
| |-- SDL2.framework 
| 
|-- Source/ 
| |-- main.cpp 
| 
|-- Frameworks/ 
| |-- SDL2.framework 

凡main.cpp中只包含:

#include <iostream> 
#include <SDL2/SDL.h> 

int main(int, char**) { 
    if (SDL_Init(SDL_INIT_VIDEO) != 0) { 
    std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; 
    return 1; 
    } 
    std::cout << "SDL LOADED CORRECTLY!" << std::endl; 
    SDL_Quit(); 
    return 0; 
} 

而且SDL2.framework从2.0.3 Mac Development Library


编译

我可以成功地编译和链接铿锵:

clang++ -framework SDL2 -FFrameworks Source/main.cpp -o Output/main_test 

使用-F预处理标志为Frameworks目录手动添加到搜索路径的框架包括的文件。


运行

生成的可执行文件运行正常,如果存在于全球SDL2.framework构架目录,/Library/Frameworks/

$ sudo cp -R Frameworks/SDL2.framework/ /Library/Frameworks/SDL2.framework/ 
$ ./Output/main_test 
SDL LOADED CORRECTLY! 

但是我宁愿它如果可执行文件中使用的SDL2.framework输出目录,而不是在Global框架目录中需要一个目录。

但是,如果没有全球框架的可执行文件不再运行:

$ sudo rm -rf /Library/Frameworks/SDL2.framework/ 
$ sudo cp -R Frameworks/SDL2.framework/ Output/SDL2.framework/ 
$ ./Output/main_test 
dyld: Library not loaded: @rpath/SDL2.framework/Versions/A/SDL2 
    Referenced from: /Users/Jo/Desktop/Temp_Project/./Output/main_test 
    Reason: image not found 
Trace/BPT trap: 5 


问题

@rpath从哪里可执行文件正在运行的路径?在这种情况下,为什么它无法找到它?至于我可以告诉所需的文件是在正确的位置:

$ ls -l Output/ 
total 32 
[email protected] 6 Jo staff 204 Mar 15 2014 SDL2.framework 
-rwxr-xr-x 1 Jo staff 15252 Jun 24 17:35 main_test 

$ ls -l Output/SDL2.framework/Versions/A/ 
total 3448 
[email protected] 56 Jo staff  1904 Mar 15 2014 Headers 
[email protected] 3 Jo staff  102 Mar 15 2014 Resources 
[email protected] 1 Jo staff 1762208 Mar 15 2014 SDL2 
[email protected] 3 Jo staff  102 Mar 15 2014 _CodeSignature 

用下面otool库输出:

otool -L Output/main_test 
Output/main_test: 
    @rpath/SDL2.framework/Versions/A/SDL2 (compatibility version 1.0.0, current version 3.1.0) 
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 


TL; DR

有没有在编译时缺少一个步骤,该步骤将使可执行文件在相对于它的位置使用Framework,而不是绝对的Glo bal one?

看起来好像this Question可能是相关的,但由于这篇文章尚未得到解答。

回答

0

我花了一段时间,但我现在终于明白如何使用@rpath

@rpath在库/框架上意味着可执行文件可以提供一个路径,我们可以使用-rpath来设置路径,我们可以将它设置为@executable_path

在这种情况下,编译我的main_test可执行文件时,我需要做到以下几点:

clang++ -framework SDL2 -F ./Frameworks Source/main.cpp -o ./Output/main_test -rpath @executable_path/ 

然后运行main_test时,因为@rpath将是该可执行文件路径(@executable_path),图书馆将从其相对位置正确加载。

相关问题