C ++在Mac上查找执行path

假设我的可执行文件位于Mac OSX上的/Users/test_user/app ,并且从/Users/test_user/Desktop/run_app运行它:

 Desktop run_app$ /Users/test_user/app/exec 

在我的C ++代码中,如何find可执行文件位置的path(在本例中是/users/test_user/app )? 我需要在我的代码中的此path中引用一些其他文件,并且不希望在代码中放置绝对path,因为有些用户可能将文件夹放在不同的位置。

假如我正确地理解了你的话,你应该可以使用NSProcessInfo-arguments方法来获得可执行的路径。

要将Objective-C代码与C ++代码混合,只需将.cpp中的源文件的文件扩展名从.cpp更改为.mm即可。 然后将Foundation.framework添加到目标的“链接二进制库”构建阶段。

[EDIT]更新以显示argv[0][[[NSProcessInfo processInfo] arguments] objectAtIndex:0]之间的区别。

然后使用代码,你可以做下面的代码:

 #include <iostream> #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // print out raw args NSMutableArray *arguments = [NSMutableArray array]; for (NSUInteger i = 0; i < argc; i++) { NSString *argument = [NSString stringWithUTF8String:argv[i]]; if (argument) [arguments addObject:argument]; } NSLog(@"arguments == %@", arguments); const char *executablePath = [[[[NSProcessInfo processInfo] arguments] objectAtIndex:0] fileSystemRepresentation]; printf("executablePath == %s\n", executablePath); const char *executableDir = [[[[[NSProcessInfo processInfo] arguments] objectAtIndex:0] stringByDeletingLastPathComponent] fileSystemRepresentation]; printf("executableDir == %s\n", executableDir); [pool release]; return 0; } 

如果我然后cd到可执行文件的父目录,然后使用相对路径执行可执行文件:

 MacPro:~ mdouma46$ cd /Users/mdouma46/Library/Developer/Xcode/DerivedData/executablePath-ewememtbkdajumdlpnciyymduoah/Build/Products/Debug MacPro:Debug mdouma46$ ./executablePath blah blah2 

我得到以下输出:

 2011-08-10 12:59:52.161 executablePath[43554:707] arguments == ( "./executablePath", blah, blah2 ) executablePath == /Users/mdouma46/Library/Developer/Xcode/DerivedData/executablePath-ewememtbkdajumdlpnciyymduoah/Build/Products/Debug/executablePath executableDir == /Users/mdouma46/Library/Developer/Xcode/DerivedData/executablePath-ewememtbkdajumdlpnciyymduoah/Build/Products/Debug 

所以,虽然argv[0]可能不一定是完整路径,但从[[[NSProcessInfo processInfo] arguments] objectAtIndex:0]返回的结果将是。

所以,有[[[NSProcessInfo processInfo] arguments] objectAtIndex:0] ,或者稍微简单的方法就是使用NSBundle本身,即使它是一个命令行工具(请参阅什么是命令行的“主包”线基础工具? ):

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; const char *executablePath = [[[NSBundle mainBundle] executablePath] fileSystemRepresentation]; [pool release]; 

如果它是一个“真正的”OS X应用程序,正确的方法是创建一个包:

http://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFBundleRef/Reference/reference.html

man 3 dyld说:

_NSGetExecutablePath()将主可执行文件的路径复制到缓冲区buf中。 bufsize参数最初应该是缓冲区的大小。 如果路径被成功复制,该函数返回0。 如果缓冲区不够大,则返回-1,* bufsize设置为所需的大小。 请注意,_NSGetExecutablePath()将返回可执行文件的“路径”,而不是可执行文件的“真实路径”。 也就是说,路径可能是一个符号链接而不是真实的文件。 对于深层目录,所需的总bufsize可能超过MAXPATHLEN。

 #include <mach-o/dyld.h> #include <limits.h> int main(int argc, char **argv) { char buf [PATH_MAX]; uint32_t bufsize = PATH_MAX; if(!_NSGetExecutablePath(buf, &bufsize)) puts(buf); return 0; } 

也许你可以使用which命令。 http://unixhelp.ed.ac.uk/CGI/man-cgi?which