2012-02-01 4 views
6

(예, dylib의 핵심은 동적으로로드되지만 자체 패키지를 만들려고한다는 것입니다.)실행 파일에 dylib-s를 포함 할 수 있습니까?

명령 줄에서 작성한 실행 파일이 있습니다. - OS-X/Lion의 경우 중요합니다. 실행 파일을 친구에게 전달했지만 라이브러리가 설치되어 있지 않아 실행할 수 없습니다. 그는 이 아니라 라이브러리를 설치해야합니다. 이제는 원래의 실행 파일과 필요한 모든 라이브러리를 포함하는 패키지를 만들려고합니다.

저는 XCode (IDE)에서 익숙해졌으며 make 및 명령 줄 작성 도구와 해당 옵션에 익숙하지 않습니다. (나는이 도구를 웹에서 매우 훌륭한 지침을 따라 작성했다.) 따라서 명시적인 지시가 도움이 될 것이다.

감사합니다.

+0

abarnert의 답변을 받아 들일 수 있습니까? 그것은 다른 사람들이 그것을 찾는데 도움이 될 것입니다. 그것은 나를 위해 매우 도움이되었습니다. – Yitz

+0

완료. 지연에 대해 유감스럽게 생각합니다. – Olie

답변

10

dylib를 실행 파일에 직접 넣을 수는 없습니다. (이것은 번들이 무엇을 위해 만들어 졌는지는 알 수 있지만 명령 행 도구로는 도움이되지 않습니다.)

각 dylib는 정적 (.a) 라이브러리로 재구성 할 수 있습니다.이 경우 모든 실행 가능한 코드 니즈가 실행 파일에 복사 될 것이고, 당신은 그것으로 무엇이든 배포 할 필요가 없다. 라이브러리에 소스가있는 경우 일반적으로 매우 쉽습니다.하지만 빌드 방법을 정확히 알지 못하면 무엇을 변경해야하는지 알려주지 못합니다.

정적 연결에서 유의할 사항 중 하나는 서로 다른 라이선스가 함께 재생되는 방식에 영향을 미친다는 점입니다. 특히, 사용중인 라이브러리 중 LGPL 라이센스가있는 경우 정적 연결은 동적 연결에 영향을 미치지 않습니다. 자세한 내용은 this question (및 해당 답변의 링크)을 참조하십시오. 실제로 라이센스에 대한 법률 자문을 위해 스택 오버플로 (Stack Overflow)에 대한 대답을 신뢰해서는 안됩니다. 어쨌든, 그건 아마도 OP의 "나는 프로그램을 만들어서 그것을 내 친구에게주고 싶다"는 문제는 아니지만, 나중에이 질문을 읽는 다른 사람들을 위해서일지도 모른다.

정적 연결이 가능하지 않거나 바람직하지 않은 경우 실행 파일과 dylib을 패키지로 묶어 친구의 컴퓨터에 가져 오기 만하면됩니다. 그는 분명히 설치 프로그램을 실행하고 싶지 않으므로 tarball 또는 zipfile을 의미합니다.

유일한 까다로운 부분은 exe가 dylib를 찾을 위치를 알고 있는지 확인하는 것입니다. 각 dylib가 dyld 검색 경로에 있지 않는 한 (자세한 내용은 dyld에 대한 맨 페이지를 참조하십시오. 그러나 아무것도 설치하지 않으려는 경우에는 도움이되지 않습니다) 또는 정확히 동일한 위치에 있습니다. 실행 파일을 실행하면 dyld의 "image not found"오류가 발생하여 실패합니다.

"똑같은 장소"는 "/ executable/path/libfoo.dylib"와 같은 절대 경로가 아니라 "myex와 동일한 디렉토리에 있음"을 의미 할 수 있습니다. /libfoo.dylib "또는"../../foo/build/Release/libfoo.dylib "와 같은 상대 경로를 사용하십시오.(일반 상대 경로는 현재 작업 디렉토리가 아닌 실행 파일 또는 번들 디렉토리를 기준으로합니다.) 당신은 myexe이 수행하여보고된다

을 볼 수에 찾고 아니에요

otool -L myexe 

아무것도 @ executable_path은 (물건을 제외하고/lib 디렉토리와 OS의 일부이며 배포 할 필요가 없습니다은/usr/lib 디렉토리에), 당신은 다음과 같이 해결할 수 :

install_name_tool -change ../../../mydl/build/Release/libmydl.dylib @executable_path/libmydl.dylib myexe 

를 이제, 당신은 그냥 모두 복사해야 myyles 바로 옆에있는 그 dylib을 타르다가 친구에게줍니다. 그는 단지 그것을 untar 수 있으며 exe를 실행합니다.

+0

언급 했어야하지만 한 가지 : 정적 라이브러리를 사용하려면 라이센스가 호환되는지 확인해야합니다. 나는 대답을 편집 할 것이다. – abarnert

+1

Spot on - install_name_tool의 관점에서, 줄 끝 부분에 실행 파일의 이름이 필요하다는 사실을 놓치고 있습니다. – Damian

+0

@Damian : 잘 했어, 고마워. 답변을 수정했습니다. – abarnert

-1

Mac OS X에서 dylib는 일반적으로 "/ usr/local /"에 저장됩니다. 기본적으로 모든 응용 프로그램은 "/ usr/local /"에 필요한 dylib를 찾습니다.

옵션 1은 친구들의 컴퓨터에 "/ usr/local /"이라는 dylib를 두는 것입니다.

옵션 2, 실행 파일과 동일한 디렉토리에 dylib을 두십시오.

옵션 3, 응용 프로그램 또는 dylib의 경로를 수정하십시오. XCode dylib looking in /usr/lib이 유용 할 것입니다. 이 옵션을 사용하여 dylib을 원하는 위치, 즉 응용 프로그램 패키지의 내부와 외부 모두에 패키지화 할 수 있습니다.

+2

응용 프로그램은/usr/local에서 dylib를 찾지 않습니다. 아마도/usr/local/lib를 의미했을 것입니다.하지만 부분적으로 만 정확합니다. dyld의 맨 페이지는 어디서 볼 수 있는지 설명합니다 (특히 DYLD_LIBRARY_PATH 및 DYLD_FALLBACK_LIBRARY_PATH 참조). – abarnert