문제

을 만들려고하는 맥 응용 프로그램 XCode 에서는 일부를 구현하는 동적 라이브러리입니다.

추가로 새로운 대상(동적 라이브러리)나 XCode 코코아 프로젝트 후의 비트와 싸우고 프레임워크 및 미리 컴파일된 헤더가 있 dynlib 컴파일과 실행에서 성공적으로 디버거.

실행하면 독립 실행형 그러나 그것의 명백한 dynlib 는 잘못된 위치에 있습니다."라이브러리에 로드되지 않:/usr/local/lib/testlib.dynlib".On Windows-내보다 일반적인 플랫폼-Dll 을 배치할 수 있습과 같은 폴더에 exe,어디서나 시스템에 있는 경로입니다.

오히려 다음과 같은 내용을 보기 위해 dynlib 어딘가에서 그 응용 프로그램 번들(그리고 특정 문서를 확인하는 것이로 올바른 방식),하지만 난지 않는 방법을 알고 있습니다.

그것은 구성하는 프로젝트 XCode 에서는 dylib 실제로 복사한 응용 프로그램에 번들,장소에서 응용 프로그램은 그것을 찾?


그것은 내가 사용할 필요가 없 otool 을 다시 설정한다.경우 편집 대상 정보를 빌드->->배포->설치 디렉토리를 변경할 수 있습에서,내부 XCode,경로는 dyld 보기 위하여 려고 하고서에 대한 dylib.기본적으로 새로운 동적 라이브러리 프로젝트의 경로 설정 /usr/local/lib.는 변경 ./ -otool 을 확인합니다./ 은 지금 어디 dyld 가 찾는 이를 위해 특정 동적 모듈이 있습니다.습니다./ 하지 않는 것은 실제로 어떤 디렉토리 내 응용 프로그램에서 뭉치:(

그래서 나의 질문(응답하지 않는 다른 스레드에서)이제는:1.어떻게 입력하는 의미있는 상대 경로에 대한 정보->...->설치 디렉토리 설정 2.어떻게 받을 수 있 엑스 코드를 자동으로 복사 dylib'대상'으로 응용 프로그램 번들상의 번들에 폴더에 상대적인 위치는?

도움이 되었습니까?

해결책

마침내. 일부를 찾았습니다 공식 문서. Xcode 내에서 완전히 수행 할 수 있습니다.

나는 도서관의 설치된 디렉토리 설정을 수정하기 위해 그곳에서 반쯤있었습니다. @executable_path/../Frameworks

그런 다음 라이브러리에 "복사 파일"빌드 단계를 추가하여 실제로 프레임 워크 폴더에 복사해야했습니다.

단순한. 자동적 인.

다른 팁

나는 당신을 믿지 않은 복사 동적 라이브러리로 응용 프로그램 번들은 컴파일때 정해진다.

응용 프로그램를 찾는 포인트 파일시스템에 있지만,그것만 아니라 이 후에는지 그것을 찾는 응용 프로그램 내부에 있습니다.당신을 사용할 필요가 otool 명령을 수정하는 바이너리 한 후 그것을 컴파일(를 사용하여 빌드 스크립트).

당신은 당신을 찾을 것입니다 대답이 이전에 질문:을 만들고 싶으면 어떻게 해야 하는 동적 라이브러리에서 Xcode.

행운을 빕니다.

많은 연구를 마친 후 나는 그것을 얻었고, 나는 "라이브러리가로드되지 않음 : ...."오류를 받고 있었기 때문에 내 응용 프로그램과 함께 OpenCV Dylib를 포장하려고 노력했다.

Dylibs에는 처음으로 할 때 설치 한 위치를 나타내는 설치 이름이 있습니다 (Macports는/opt/local/lib/에 설치합니다). 그들은 또한 다른 Dylib의 길을 가지고 있습니다. 예를 들어, "libopencv_core.2.4.8.dylib"라는 Dylib가있는 경우이 명령에서 사용하는 다른 Dylib의 설치 이름과 경로를 확인할 수 있습니다.

otool -L libopencv_core.2.4.8.dylib

명령의 출력은 다음과 같습니다.

libopencv_core.2.4.8.dylib:
/opt/local/lib/libopencv_core.2.4.dylib (compatibility version 2.4.0, current version 2.4.8)
/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

1- 첫 번째 줄 : 확인중인 파일 이름.

2- 두 번째 줄 : 확인중인 Dylib의 설치 이름입니다. (Macports는/opt/local/lib/에 설치합니다)

3- 세 번째 줄 : 모든 OSX 시스템에 있지 않은 다른 Dylibs 로의 경로. (Macports는/opt/local/lib/에 설치하고 이전에 설치 되었기 때문에 이들을 설치하므로 다른 Mac에 앱을 배포하면 "라이브러리가 찾을 수 없음"오류가 발생합니다).

4 & 5- 라인 4 및 5 : 모든 MacOSX 시스템 내부의 Dylib. 프로젝트에서 복사 할 필요가 없습니다.

이제 우리는 이것을 알고 있습니다. 우리의 목표는 다음과 같습니다.

1- Dylibs 내부의 모든 경로 (필요한 다른 Dylib에 이름과 경로를 설치)를 변경하고 "프레임 워크"디렉토리에 앱 내부에 Dylib를 넣고 앱을 이동하거나 다른 Mac으로 복사 할 때. 우리는 Dylibs가 앱 디렉토리 내부의 "프레임 워크"폴더 내부에서 서로를 찾기를 원합니다 : 우리가 사용할 경로는 다음과 같습니다.

@executable_path/../Frameworks/nameOFTheDylib.dylib

(두 지점이 정말 중요합니다!)

2- Xcode로 복사하여 우리가 필요로하는 모든 dylibs를 복사하지만/opt/local/lib 폴더 내부의 모든 딜질이 아닙니다. 우리가 필요로하는 dylibs (보통 4 또는 5)와 4 ~ 5 개가 작업을 위해 필요하기 때문에 포함 된 Dylibs의 링크.

y 마침내 이런 식으로 그렇게했습니다.

a) 경로를 변경하려면 :

1- 모든/opt/local/lib 파일을 데스크탑에 복사하십시오.

2- .dylib 아카이브가 아닌 Lib 폴더 내부의 모든 파일을 제거하십시오.

3-이 스크립트는 Lib 폴더 내부 (Dylibs와 함께) 데스크탑에서 방금 복사했습니다.

(이 텍스트를 textedit에 복사하여 theameyouprefer.sh로 저장하십시오)

#!/bin/bash
echo empieza el script

EXECFILE=${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}
OLDLIBPATH="/opt/local/lib/"
NEWLIBPATH="@executable_path/../Frameworks/"
ACTUALPATH=`pwd`
# space separated list of libraries
for TARGET in ${ACTUALPATH}/* ; do
TARGET=$(basename $TARGET)
    if [ ${TARGET: -6} == ".dylib" ]
    then
        echo otool -DX ${TARGET}
        TARGETID=`otool -DX ${TARGET}`
        echo ${TARGETID}

        echo install_name_tool -id ${NEWLIBPATH}${TARGET} ${TARGET}
        echo `install_name_tool -id ${NEWLIBPATH}${TARGET} ${TARGET}`

        for DYLIB in ${ACTUALPATH}/* ; do
        DYLIB=$(basename $DYLIB)
            if [ ${DYLIB: -6} == ".dylib" ]
            then
                echo install_name_tool -change ${TARGETID} ${NEWLIBPATH}${TARGET} ${DYLIB}
                echo `install_name_tool -change ${TARGETID} ${NEWLIBPATH}${TARGET} ${DYLIB}`
            else
                if [ ${DYLIB: -3} == ".sh" ]
                then
                    echo soyYo
                else
                    echo mkdir ${ACTUALPATH}/eliminadas/
                    echo `mkdir ${ACTUALPATH}/eliminadas/`
                    echo mv ${DYLIB} ${ACTUALPATH}/eliminadas
                    echo `mv ${TARGET} ${ACTUALPATH}/eliminadas`
                fi
            fi
        done
    else
if [ ${TARGET: -3} == ".sh" ] || ![ -h ${TARGET} ]
        then
            echo noMeElimino
        else
            echo mkdir ${ACTUALPATH}/eliminadas/
            echo `mkdir ${ACTUALPATH}/../eliminadas/`
            echo mv ${TARGET} ${ACTUALPATH}/eliminadas/${TARGET}
            echo `mv ${TARGET} ${ACTUALPATH}/../eliminadas`
        fi
    fi
done

echo finaliza el script

4- 실행 :

cd Desktop/lib
sudo ./theNameYouPrefer.sh

Dylibs가 쓰기로 보호 될 수 있기 때문에 Sudo로 실행하는 것이 정말 중요합니다.

이 시점에서 모든 Dylibs 경로가 변경되어야합니다. 명령으로 일부 dylibs에서 확인할 수 있습니다.

otool -L theDylibYouPrefer.dylib

b) 모든 lib 폴더가 아니라 필요한 dylib 만 선택하십시오.

1- lib2에 lib 폴더를 rename : lib =====> lib2

2- 데스크탑에서 Lib2 폴더 옆에있는 다른 폴더 (예를 들어 examplefolder와 같은 이름으로)를 만듭니다.

3- 예제 폴더 내부를 복사하십시오. 당신이 당신이 그들을 필요로하는 중요한 dylibs를 확실히 알고 있습니다. 내 경우에는 다음과 같습니다. 2.4.8. Dylib

4- 스크립트 : 중요한 dylibs 옆에있는 examplefolder 내부에서 복사하십시오. 나는 스크립트에 대해 많이 알지 못 하므로이 사람은 조금 더 더럽습니다.

#!/bin/bash
echo empieza el script

EXECFILE=${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}
OLDLIBPATH="/opt/local/lib/"
NEWLIBPATH="@executable_path/../Frameworks/"
ACTUALPATH=`pwd`
# space separated list of libraries
for TARGET in ${ACTUALPATH}/* ; do
TARGET=$(basename $TARGET)
    if [ ${TARGET: -6} == ".dylib" ]
    then
        echo otool -DX ${TARGET}
        TARGETID=`otool -L ${TARGET}`
echo ${TARGETID}

echo :::::::::::::::::::::::::::

ELIM=`echo ${TARGETID} | sed 's/([^)]*)/UUU/g'`
echo $ELIM
#echo ${TARGETID} | sed 's/([^)]*)/UUU/g'
ELIM=`echo $(awk '{gsub("@executable_path/../Frameworks/", "");print}' <<< ${ELIM})`
echo $ELIM

ELIM=`echo $(awk '{gsub(" UUU", "");print}' <<< ${ELIM})`
echo $ELIM

ELIM=`echo $(awk '{gsub(":", "");print}' <<< ${ELIM})`
echo $ELIM

IFS=' ' read -a ARRAY <<< $ELIM

for element in ${ARRAY[@]}
do
    echo $element
    if [[ ${element} == */* ]]
    then
        echo "NO FRAMEWORK";
    else
        echo `mkdir ${ACTUALPATH}/../copy`
        echo `cp ${ACTUALPATH}/../lib2/${element} ${ACTUALPATH}/${element}`
    fi
done


    else
if [ ${TARGET: -3} == ".sh" ] || ![ -h ${TARGET} ]
        then
            echo noMeElimino
        else
            echo mkdir ${ACTUALPATH}/eliminadas/
            echo `mkdir ${ACTUALPATH}/../eliminadas/`
            echo mv ${TARGET} ${ACTUALPATH}/eliminadas/${TARGET}
            echo `mv ${TARGET} ${ACTUALPATH}/../eliminadas`
        fi
    fi
done

echo finaliza el script

5- examplefolder 내부의 파일 수가 변경되지 않는다는 점에 감사 할 때 까지이 스크립트를 여러 번 실행하십시오.

6- 당신이 필요한 dylibs는 모두 examplefolder 내부입니다! 제 경우에는 61 개의 딜브가 있습니다. (우리가 시작했을 때 나는 거기에 4 개의 dylibs를 배치했습니다)

7- 마지막으로해야 할 일은 Xcode의 "프레임 워크"폴더 내부를 떨어 뜨리는 것입니다. 그런 다음 "위상 빌드"로 이동하여 "복사 파일"단계를 추가해야합니다 : "편집기"=> "빌드 위상 추가"=> "복사 파일 추가"및 "복사 파일"단계에서 플러스를 클릭하십시오. 아이콘과 "framewroks"폴더에서 찾을 수있는 모든 dylib를 추가하십시오. 필요한 대상은 프레임 워크입니다.

그리고 그게 다, 나는 그것을 이런 식으로 얻었다.

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