При условии, что я вас правильно понимаю, вы должны быть в состоянии использовать NSProcessInfo
-arguments
метод для получения пути к исполняемому файлу.
Для смешивания в Objective-Cкод с кодом C ++, вы можете просто изменить расширение имени файла рассматриваемого исходного файла с .cpp на .mm.Затем добавьте Foundation.framework в фазу сборки Link 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
сам по себе, даже если это инструмент командной строки (см. Что такое «основной пакет» инструмента основания командной строки? ):
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
const char *executablePath =
[[[NSBundle mainBundle] executablePath] fileSystemRepresentation];
[pool release];