C++ C++;在Mac上查找执行路径
假设我的可执行文件位于Mac OSX上的C++ C++;在Mac上查找执行路径,c++,linux,macos,directory,C++,Linux,Macos,Directory,假设我的可执行文件位于Mac OSX上的/Users/test\u user/app,我从/Users/test\u user/Desktop/run\u app运行它: Desktop run_app$ /Users/test_user/app/exec >在我的C++代码中,我如何找到可执行文件的位置路径(在这种情况下,将是 /用户/测试用户/应用程序< /代码>)?我需要在我的代码中引用此路径处的其他一些文件,并且不希望在代码中放置绝对路径,因为某些用户可能会将文件夹放置在其他位置。
/Users/test\u user/app
,我从/Users/test\u user/Desktop/run\u app
运行它:
Desktop run_app$ /Users/test_user/app/exec
<> >在我的C++代码中,我如何找到可执行文件的位置路径(在这种情况下,将是<代码> /用户/测试用户/应用程序< /代码>)?我需要在我的代码中引用此路径处的其他一些文件,并且不希望在代码中放置绝对路径,因为某些用户可能会将文件夹放置在其他位置。也许您可以使用
which
命令 如果它是一个“真正的”OS X应用程序,正确的方法是创建一个捆绑包:
如果我理解正确,您应该能够使用
NSProcessInfo
的方法获取可执行路径
< >将Objul-C代码与C++代码混合,您可以将源文件的文件扩展名从.CPP更改为.mm。然后将基础框架添加到链接二进制文件和目标库的构建阶段。p>
[编辑]已更新以显示argv[0]
和[[[NSProcessInfo processInfo]参数]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;
}
我得到以下输出:
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]参数]objectAtIndex:0]
返回的结果将是
因此,有[[[NSProcessInfo processInfo]参数]objectAtIndex:0]
,或者一种稍微简单的方法就是只使用NSBundle
本身,即使它是一个命令行工具(请参阅):
man3dyld
说:
_NSGetExecutablePath()将主可执行文件的路径复制到
缓冲区buf。bufsize参数最初应为
缓冲器如果路径复制成功,则此函数返回0。
如果缓冲区不够大,并且设置了*bufsize,则返回-1
到所需的尺寸。请注意,\u NSGetExecutablePath()将返回“a”
指向可执行文件的“路径”不是指向可执行文件的“实际路径”。就是,
路径可能是符号链接,而不是实际文件。深沉
所需的总bufsize目录可能超过MAXPATHLEN
#包括
#包括
int main(int argc,字符**argv)
{
char buf[PATH_MAX];
uint32\u t bufsize=路径最大值;
if(!\NSGetExecutablePath(buf和bufsize))
put(buf);
返回0;
}
否。否。命令中的仅显示用户路径上该命令的第一个结果。这不能解释直接启动命令的原因(如问题中所述)。这是unix可执行文件还是.app捆绑包?我认为这不是一个可靠的解决方案,因为argv[0]不能保证是绝对路径。@sbooth:已更新以显示argv[0]之间的差异
和NSProcessInfo
的-arguments
方法。很高兴知道这些,谢谢。我想知道NSProcessInfo是否只是在引擎盖下使用了_NSGetExecutablePath。我还想知道它是如何处理符号链接和可执行文件被取消链接但仍在运行的情况的。但这些都是一般性问题,并非特定于NSProcessInfo本身。
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
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
const char *executablePath =
[[[NSBundle mainBundle] executablePath] fileSystemRepresentation];
[pool release];
#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;
}