문제

저는 C++로 작성한 GLFW 앱을 실행하고 있습니다.

나는 다음과 같이 실행합니다 :

./prog.app/Contents/MacOS/prog # from the command line

그러나 내 코드는 상대 경로 파일을 제대로 읽을 수 없습니다.

그래서 나는 이 Mac 번들이 나의 현재 디렉토리를 변경하고 있다고 믿습니다.

1) 무엇으로 바뀌나요?2) 이것을 제어할 수 있나요?

감사해요!

도움이 되었습니까?

해결책

앱이 시작될 때 현재 작업 디렉토리에 대한 가정을하지 마십시오. 파인더는 이것에 대해 합리적으로 일관성이 있지만 앱을 시작하는 유일한 방법은 아닙니다. 예를 들어 Xcode에서 디버깅 할 때 초기 작업 디렉토리는 다르며 예상대로 작업 디렉토리를 설정하거나 설정하지 않을 수도있는 다양한 방법이 있습니다. 완전히 관련이없는 디렉토리에서 명령 줄에서 앱을 시작하여 앱을 테스트해야합니다.이 조건에서 여전히 파일을 찾으면 모양이 양호합니다.

다른 팁

이 코드를 사용하여 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; 

종종 사용자의 홈 디렉토리입니다. 그것이 보장되는지 확실하지 않지만 Cocoa 앱 내부에서 chdir ()를 사용할 수 있습니다. 요구 사항에 따라 파일 시스템 북마크 (10.6+) 또는 별명 (이전)을 사용하는 경우 사용자는 더 나은 경험을 가질 수 있습니다. 또는 변경 작업 디렉토리에 대해 여전히 강력한 절대 경로조차도.

GLFW 소스를 보면 init 동안 OSX에서 현재 디렉토리가 명시 적으로 변경되는 것을 볼 수 있습니다. 이봐 그리고 약 236 줄 (또는 CHDIR 검색)으로 스크롤하십시오.

나는 현재 GLFW가 INIT 동안 명백한 chdir를하는 이유를 이해하려고 노력하고 있기 때문에 당신의 질문을 발견했습니다. OSX를 제외한 모든 플랫폼에서 작동하는 프로그램이 있기 때문에 이것을 발견했습니다. OSX에서는 상대 경로를 사용하여 데이터 파일을 찾을 수 없습니다. 내 임시 솔루션은 GLFW를 초기화 한 후 메인이 시작하고 현재 디렉토리를 재설정 할 때 현재 디렉토리를 가져 오는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top