osx에서 .so와 .dylib의 차이점은 무엇입니까?
.dylib는 OSX의 동적 라이브러리 확장이지만 전통적인 유닉스 .so 공유 객체를 사용할 수 없거나 사용하지 않아야 할 때 명확하지 않습니다.
내가 가진 몇 가지 질문 :
- 개념적 수준에서 .so와 .dylib의 주요 차이점은 무엇입니까?
- 언제 다른 것을 사용할 수 있습니까?
- 컴파일 요령 및 팁 (예 : osx에서는 작동하지 않으므로 gcc -shared -fPIC 대체)
실행 파일과 라이브러리를 위해 Mac OS X에서 사용되는 Mach-O 객체 파일 형식은 공유 라이브러리 와 동적으로로드 된 모듈을 구분 합니다 . otool -hv some_file
의 파일 형식을 보는 데 사용 하십시오 some_file
.
Mach-O 공유 라이브러리는 파일 형식을 MH_DYLIB
가지며 확장자는 .dylib입니다. -lfoo
libfoo.dylib 와 같은 일반적인 정적 링커 플래그와 연결할 수 있습니다 . -dynamiclib
플래그를 컴파일러 에 전달하여 만들 수 있습니다 . ( -fPIC
기본값이며 지정할 필요가 없습니다.)
Mach-O에서로드 가능한 모듈을 "번들"이라고합니다. 파일 형식이 MH_BUNDLE
있습니다. 그들은 어떤 연장이라도 가질 수있다. 확장 기능 .bundle
은 Apple에서 권장하지만 대부분의 이식 소프트웨어는 .so
호환성을 위해 사용 합니다. 일반적으로 애플리케이션을 확장하는 플러그인 용 번들을 사용 합니다. 이러한 상황에서 번들은 애플리케이션 바이너리에 링크되어 애플리케이션의 내 보낸 API에 액세스합니다. -bundle
플래그를 컴파일러 에 전달하여 만들 수 있습니다 .
dylibs 및 번들 모두 동적으로 사용하여로드 할 수있는 dl
API를 (예를 들어 dlopen
, dlclose
). 번들이 공유 라이브러리 인 것처럼 번들에 링크 할 수 없습니다. 그러나 번들이 실제 공유 라이브러리에 링크 될 수 있습니다. 번들이로드되면 자동으로로드됩니다.
역사적으로 차이가 더 컸습니다. Mac OS X 10.0에서는 라이브러리를 동적으로로드 할 방법이 없었습니다. dyld API를 세트는 (예를 들어 NSCreateObjectFileImageFromFile
, NSLinkModule
)로드 및 언로드 번들 10.1 도입,하지만 그들은 dylibs에 대한 작업을하지 않았다되었다. dlopen
번들과 함께 작동 하는 호환성 라이브러리가 10.3에 추가되었습니다. 10.4에서 dlopen
dyld의 기본 부분으로 다시 작성되었고 dylib로드 (언로드는 아님)에 대한 지원이 추가되었습니다. 마지막으로 10.5 dlclose
는 dylib와 함께 사용하기위한 지원을 추가 하고 dyld API를 더 이상 사용하지 않습니다.
Linux와 같은 ELF 시스템에서는 둘 다 동일한 파일 형식을 사용합니다 . 공유 코드는 라이브러리 및 동적로드로 사용할 수 있습니다.
마지막으로, Mac OS X에서 "번들" 은 실행 가능한 코드와 해당 코드에서 사용하는 리소스를 보유하는 표준화 된 구조의 디렉토리를 나타낼 수도 있습니다. 개념적으로 겹치는 부분 (특히 플러그인과 같은 "로드 가능한 번들"(일반적으로 Mach-O 번들 형태의 실행 코드 포함))이 있지만 위에서 논의 된 Mach-O 번들과 혼동해서는 안됩니다.
추가 참조 :
- 이 답변의 기초 인 Fink Porting Guide (Mac OS X 10.3 용으로 작성된 최신 버전이지만).
- ld (1) 및 dlopen (3)
- 동적 라이브러리 프로그래밍 주제
- 마 하오 프로그래밍 주제
.so 파일은 공유 라이브러리의 UNIX 파일 확장자가 아닙니다.
그것은 일반적인 일입니다.
ArnaudRecipes sharedlib 페이지 에서 3b 행 확인
기본적으로 .dylib는 공유 라이브러리를 나타내는 데 사용되는 mac 파일 확장자입니다.
mac OS x에서 .dylib와 .so의 차이점은 컴파일 방법입니다. .so 파일의 경우 -shared를 사용하고 .dylib의 경우 -dynamiclib를 사용하십시오. .so와 .dylib는 모두 동적 라이브러리 파일로 상호 교환 가능하며 유형은 DYLIB 또는 BUNDLE입니다. 이것을 보여주는 다른 파일에 대한 판독 결과는 다음과 같습니다.
libtriangle.dylib:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL 0x00 DYLIB 17 1368 NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS
libtriangle.so:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL 0x00 DYLIB 17 1256 NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS
triangle.so:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL 0x00 BUNDLE 16 1696 NOUNDEFS DYLDLINK TWOLEVEL
Mac OS X에서이 두 가지가 동일한 이유는 .so 파일 형식으로 컴파일되는 다른 UNIX OS 프로그램과의 호환성을 위해서입니다.
컴파일 참고 사항 : .so 파일 또는 .dylib 파일을 컴파일 할 때 연결 단계에서 동적 라이브러리에 올바른 경로를 삽입해야합니다. 링크 명령에 -install_name 및 파일 경로를 추가하여이를 수행합니다. 이 작업을 수행하지 않으면이 게시물에서 볼 수있는 문제가 발생합니다 : Mac Dynamic Library Craziness (Fortran Only) .
cmake를 사용하여 OSX에서 순진한 코드를 작성하는 동안 방금 관찰 한 내용은 다음과 같습니다.
cmake ... -DBUILD_SHARED_LIBS=OFF ...
.so 파일을 만듭니다.
동안
cmake ... -DBUILD_SHARED_LIBS=ON ...
.dynlib 파일을 만듭니다 .
아마도 이것은 누군가를 도울 것입니다.
참고 URL : https://stackoverflow.com/questions/2339679/what-are-the-differences-between-so-and-dylib-on-osx
'IT story' 카테고리의 다른 글
C ++ 11에서 로컬 정적 변수 초기화는 스레드로부터 안전합니까? (0) | 2020.05.12 |
---|---|
package-lock.json의 역할은 무엇입니까? (0) | 2020.05.12 |
이 게임의 수학적 / 계산 원칙은 무엇입니까? (0) | 2020.05.12 |
instanceof와 동등한 C ++ (0) | 2020.05.12 |
문자열에“”를 추가하면 왜 메모리가 절약됩니까? (0) | 2020.05.12 |