문제

Xcode (일반 C, Cocoa 없음)에 명령 줄 유틸리티가 거의 없습니다. 나는 그들 모두가 내 맞춤형 버전의 libpng를 사용하기를 원하며, 모든 실행 파일 사이에 라이브러리 사본 하나를 공유하여 공간을 절약하고 싶습니다 (다시 분배하지 않습니다. .dylib 그들과 함께).

libpng 내보내기 기호를 얻으려면 마법을해야합니까?

하다 "라이브러리와 링크 바이너리" 단계 링크를 정적으로 구축 하시겠습니까?

Apple의 문서는 실행 시간에 라이브러리로드를 언급합니다. dlopen, 그러나 누락 된 기호에 대해 불평하지 않고 Xcode를 실행 파일을 만들 수 있습니까?


나는 그것을 알아 낸 것 같아요 :

  • 32/64 비트 실행 파이브와 32 비트 라이브러리를 구축했기 때문에 LIBPNG는 제대로 연결되지 않았습니다. 라이브러리의 설정을 빌드하고 실행 파일이 일치해야합니다.

  • libpng의 config.h와 같은 수많은 정의가 필요합니다. #define FEATURE_XXX_SUPPORTED

  • "라이브러리와 링크 바이너리" 제작 단계는 동적 라이브러리를 잘 처리합니다 DYLD_FALLBACK_LIBRARY_PATH 환경 변수는 로딩을 위해 필요합니다 .dylib응용 프로그램 번들에서 S.

도움이 되었습니까?

해결책

구축 된 동적 라이브러리에 라이브러리에서 내보내야 할 내용을 나열하는 내보낸 기호 파일이 있는지 확인해야 할 것입니다. 그것은 한 줄당 하나의 기호의 평평한 목록 일뿐입니다.

또한 동적 라이브러리가 구축되면 이름을 설치하십시오 기본적으로 구축 된 경로 인 그 안에 내장되어 있습니다. 결과적으로 그것에 대해 연결하는 모든 것은 지정된 경로에서 먼저 그것을 찾을 수 있고 나중에 만 아래에 설명 된 기본 경로 세트를 검색합니다. DYLD_FALLBACK_LIBRARY_PATH 에서 dyld(1) 남자 페이지.

이 라이브러리를 실행 파일 옆에 놓으려면 설치 이름을 조정하여이를 참조해야합니다. "설치 이름"을 Google 검색 만하면이 작업에 대한 정보가 많이 나타납니다.

다른 팁

Mac OS X의 동적 링크, 작은 예

단계 :

  1. mymod.o를 포함하는 라이브러리 libmylib.dylib를 만듭니다
  2. "Callmymod"를 컴파일하고 연결하십시오.
  3. dyld_library_path 및 dyld_print_libraries를 사용하여 Callmymod에서 MyMod를 호출하십시오

문제 : "그냥"다른 모듈을 사용할 수있는 라이브러리를 만들고 싶습니다. 그러나 GCC, LD, MacOSX Libtool, Dyld와 같은 어려운 프로그램이 있습니다. 수많은 사람 페이지 (10.4.11 ppc에 7679 + 1358 + 228 + 226 줄)이 있지만 예제 방식은 그리 많지 않거나 "당신이하고있는 일을 말하는 것"모드가있는 프로그램은 많지 않습니다.

(이해에서 가장 중요한 것은 스스로 단순화 된 개요를 만드는 것입니다. 사진을 뽑고, 작은 예제를 실행하고, 다른 사람에게 설명하십시오).

배경: Apple OverViewofDynamicLibraries, Wikipedia dynamic_library


1 단계, libmylib.dylib 만들기 -

mymod.c:
    #include <stdio.h>
    void mymod( int x )
    {
        printf( "mymod: %d\n", x );
    }
gcc -c mymod.c  # -> mymod.o
gcc -dynamiclib -current_version 1.0  mymod.o  -o libmylib.dylib
    # calls libtool with many options -- see man libtool
    # -compatibility_version is used by dyld, see also cmpdylib

file libmylib.dylib  # Mach-O dynamically linked shared library ppc
otool -L libmylib.dylib  # versions, refs /usr/lib/libgcc_s.1.dylib

2 단계, Compile 및 Link CallMymod-

callmymod.c:
    extern void mymod( int x );
    int main( int argc, char** argv )
    {
        mymod( 42 );
    }
gcc -c callmymod.c
gcc -v callmymod.o ./libmylib.dylib -o callmymod
    # == gcc callmymod.o -dynamic -L. -lmylib
otool -L callmymod  # refs libmylib.dylib
nm -gpv callmymod  # U undef _mymod: just a reference, not mymod itself

3 단계, libmylib.dylib에 연결하는 Callmymod 실행 -

export DYLD_PRINT_LIBRARIES=1  # see what dyld does, for ALL programs
./callmymod
    dyld: loaded: libmylib.dylib ...
    mymod: 42

mv libmylib.dylib /tmp
export DYLD_LIBRARY_PATH=/tmp  # dir:dir:...
./callmymod
    dyld: loaded: /tmp/libmylib.dylib ...
    mymod: 42

unset DYLD_PRINT_LIBRARIES
unset DYLD_LIBRARY_PATH

그것은 하나의 작은 예를 끝냅니다. 그것이 단계를 이해하는 데 도움이되기를 바랍니다.
(이것을 많이한다면, 참조하십시오 gnu libtoolMac의 Glibtool입니다 스콘.)
건배
- 데니스

불행히도, 내 경험에서 Apple의 문서는 구식, 중복 및 일반적으로 필요한 많은 일반적인 정보를 놓치고 있습니다.

나는 내 웹 사이트에서 FMOD (Sound API)가 UNI에서 개발 한 크로스 플랫폼 게임과 함께 일 해야하는 많은 것들을 썼습니다. 이상한 과정이며 Apple이 개발자 문서에 더 많은 정보를 추가하지 않는다는 것에 놀랐습니다.

불행히도, Microsoft와 마찬가지로 "사악한"이라면 실제로 문서로 개발자를 돌보는 일을 훨씬 더 잘 수행합니다 (이것은 Apple 전도자에게서 나옵니다).

나는 기본적으로, 당신이하지 않는 일은 .app 번들을 컴파일 한 후에야한다고 생각합니다. 그런 다음 실행 파일이 라이브러리 파일을 찾는 위치를 변경하려면 실행 가능한 binary/myapp.app/contents/macos/myapp에서 명령을 실행해야합니다. 스크립트를 실행할 수있는 새 빌드 단계를 만들어야합니다. 나는이 과정을 다시 설명하지 않을 것입니다. 나는 이미 여기에서 깊이있게 해냈습니다.

http://brockwoolf.com/blog/how-to-us-us-dynamic-libraries-in-xcode-31-using-fmod

도움이 되었기를 바랍니다.

Apple 참조 페이지를 알고 있습니까? 동적 라이브러리 프로그래밍 주제? 필요한 대부분의 것을 다루어야합니다. 프로그램 시작시 무조건로드 된 공유 라이브러리와 주문형으로로드 된 동적으로로드 된 라이브러리 (번들, IIRC)가 있으며,이 두 개는 Linux 또는 Solaris의 동등한 부분과 MACOS X에서 다소 다릅니다.

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