Qual é o `pwd` de um aplicativo empacotado Mac?
Pergunta
Estou executando um aplicativo GLFW (que eu escrevi em C ++)
eu executá-lo da seguinte forma:
./prog.app/Contents/MacOS/prog # from the command line
No entanto, o meu código não pode ler arquivos relativos-pathed corretamente.
Então eu acredito que o que está acontecendo é que este Mac Bundle está mudando meu diretório atual.
1) o que é que mudá-lo para? 2) eu posso controlar isso?
Obrigado!
Solução
Nunca fazer suposições sobre o atual diretório de trabalho quando o seu aplicativo é lançado. O Finder é razoavelmente consistente sobre isso, mas não é a única maneira de lançar um aplicativo. Quando a depuração sob Xcode por exemplo a pasta de trabalho inicial irá ser diferente, e existem vários outros métodos que podem ou não podem definir o directório de trabalho conforme o esperado. Você deve testar seu aplicativo por iniciá-lo a partir da linha de comando em um diretório totalmente alheios -. Se ele ainda encontra seus arquivos sob essa condição, então você está em boa forma
Outras dicas
Você pode ser capaz de usar este pedaço de código para descobrir a localização do prog.
#include <mach-o/dyld.h>
char exe_path[MAXPATHLEN];
char link_path[MAXPATHLEN];
uint32_t size = sizeof(exe_path);
if (_NSGetExecutablePath(exe_path, &size) != 0)
assert();
if (realpath(exe_path, link_path) == 0)
assert();
return link_path;
Muitas vezes é o diretório home do usuário. Eu não tenho certeza se isso é garantido, mas você pode usar chdir () dentro aplicativos de cacau. Dependendo de suas necessidades, os usuários podem ter uma experiência melhor se você usar bookmarks sistema de arquivos (10.6+) ou aliases (mais cedo). Ou mesmo caminhos absolutos, que ainda são robustos contra mudando diretório de trabalho.
Se você olhar para as fontes GLFW, você verá que no OSX durante a inicialização muda explicitamente o diretório atual. Olhe aqui desloque-se para cerca de linha 236 (ou procurar chdir).
Eu encontrei sua pergunta SO porque eu estou atualmente tentando entender por que GLFW faz um chdir explícita durante a inicialização. Descobri isso porque eu tenho um programa que funciona em todas as plataformas, exceto OSX. No OSX não pode encontrá-lo de arquivos de dados usando um caminho relativo. Minha solução temporária é para obter o diretório atual quando principais partidas e redefinir o diretório atual após a inicialização GLFW.