C ++在Mac上查找执行路径

时间:2011-08-09 23:50:58

标签: c++ linux macos directory

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

Desktop run_app$ /Users/test_user/app/exec 

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

4 个答案:

答案 0 :(得分:3)

如果我理解正确,您应该能够使用NSProcessInfo的{​​{3}}方法获取可执行路径。

要将Objective-C代码与C ++代码混合,您只需将有问题的源文件的文件扩展名从.cpp更改为.mm即可。然后将Foundation.framework添加到Target Binary With Library构建阶段。

[编辑]已更新,以显示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本身,即使它是一个命令行工具(参见-arguments):

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

man 3 dyld说:

  

_NSGetExecutablePath()将主可执行文件的路径复制到   缓冲区bufsize参数最初应该是的大小   缓冲。如果路径已成功复制,则此函数返回0。   如果缓冲区不够大,则返回-1,并设置* bufsize   达到所需的尺寸。请注意_NSGetExecutablePath()将返回“a   路径“到可执行文件而不是可执行文件的”真实路径“。也就是说,   路径可以是符号链接而不是真实文件。有深刻的   目录所需的总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;
}

答案 3 :(得分:1)

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