2017-04-13 101 views
1

我目前在xcode上面临C++的问题。当我做fopen(“verShader.vsh”,“r”)时,它返回NULL指针。Xcode项目源文件自动复制

如果我把verShader.vsh放到/ Users/apple/Library/Developer/Xcode/DerivedData/HollowWorld -hghymrkhtbuguoaiwgp tundpakuz/Build/Prod ucts/Debug中,fopen()就可以工作。但是该文件位于main.cpp的相同目录中,即/ Users/apple/Developer/C++/HelloWorld/HelloWorld。

是否有无论如何,当我建立的项目,它可以自动复制“verShader.vsh”执行文件的目录? enter image description here

回答

0

我终于通过附加解决了这个“复制文件“在构建阶段 enter image description here

1

返回NULL指针作为工作空间.../DerivedData/......而 “verShader.vsh” 放在main.cpp中的DIR

那是因为你'使用文件名“verShader.vsh”而不提供文件路径。 Mac(和iOS)应用程序包具有特定的结构,除了可执行文件或工作目录外,所有资源都存储在特定的子目录中。

是否有无论如何,当我建立的项目,它可以自动复制“verShader.vsh”执行文件的目录?

这是错误的方法 - 你仍然需要知道你想要复制的文件的路径,一旦你知道了,你可能只是读它而不是复制它。在Objective-C或Swift中,这很容易:

NSString * path = [[NSBundle mainBundle] pathForResource:@“verShader”ofType:@“vsh”];

在C++中,你可以做使用Core Foundation的同样的事情:

CFBundleRef mainBundle = CFBundleGetMainBundle(); 
CFURLRef url = CFBundleCopyResourceURL(mainBundle, CFSTR("verShader"), CFSTR("vsh"), NULL); 
char path[255]; // space for the path 
Boolean success = CFURLGetFileSystemRepresentation(url, true, path, 255); 

(警告:它已经有一段时间,因为我需要使用核心基础,所以用上面的代码为出发点,但不要”太害羞关于自己检查docs并进行必要的修正。)

一旦你的路,你可以用通常的C使用/ C++文件的例行程序一样fopen()

+0

我试过CFURLRef burl = CFBundleCopyBundleURL(mainBundle); CFURLGetFileSystemRepresentation(url,true,path,255);并且burl返回/ Library/Developer/Xcode/DerivedData/HelloWorld-hghymrkhtbuguoaiwgptundpakuz/Build/Products/Debug的目录。但verShader.vsh位于main.cpp的相同目录 –

+0

我不确定你是否理解我的问题,如果我将verShader.vsh放到/ Users/apple/Library/Developer/Xcode/DerivedData/HollowWorld-hghymrkhtbuguoaiwgptundpakuz /构建/产品/调试fopen()将工作。但是该文件位于main.cpp的相同目录中,即/ Users/apple/Developer/C++/HelloWorld/HelloWorld。 –

+0

在运行时*有*没有'main.cpp'文件 - 该源文件将被编译并转换为可执行代码。如果你想让'verShader.vsh'成为你的代码可以访问的内置于你的程序中的文件,那么你应该将它作为一个*资源*,以便在应用程序构建时将它复制到应用程序的包中。如果您只是希望它成为文件系统中的某个文件,那么您需要编写代码来确定文件的* path *并使用它,而不是仅仅期望它位于工作目录中。我认为这是一种资源,但无论哪种方式,你都应该提供路径。 – Caleb