我正试图编译一个简单的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可能是相关的,但由于这篇文章尚未得到解答。