컴퓨터 그래픽스/OpenGL

#3 gulender 개발일지 : rpath 설정

san10 2024. 5. 8. 18:28

맥북에서 윈도우 게임을 즐기기위해..

게임포팅툴킷을 설치하려고...

sonoma로 맥을 업데이트 했더니.........

빌드가 터졌다

^______________^

 

더 정확히 말하자면 빌드가 안되는 건 아니고

실행 시점에서 문제가 생긴다.

Library not loaded: @rpath/libglfw.3.dylib

Reason: no LC_RPATH's found

 

에러로그를 살펴보면 libglfw.3 동적 라이브러리 파일 경로를 못찾는다고 나온다.

보통 dylib 파일은 usr/local/lib에 있는데..

터미널에서 찾아보면

아니 잘 있구만..

 

컴파일, 링크, 빌드

c, c++과 같은 언어에서는

컴파일을 통해 오브젝트 파일을 만들고

링커를 통해 동적 라이브러리 파일과 링크해서

실제 실행파일을 만든다.

https://www.tcpschool.com/c/c_intro_programming

그러니깐 빌드는 잘 되는데

rpath/libglfw.3.dylib 위치를 못찾아서 실행이 안되는 것이다..

상식적으로 그럼 rpath는 usr/local/lib가 되어야하는건데..

에러로그를 보면 rpath라는 것 자체가 없다.

 

rpath

rpath란 위키피디아의 설명에 따르면

실행 파일이나 라이브러리에 하드코딩 된 런타임 검색 경로라고 정의한다.

그니깐 머.. 동적 라이브러리 파일(dll, dylib)이 있는 경로겠지..

이러한 동적 라이브러리 파일을 찾을때 최우선으로 rpath에 있는 곳을 뒤지는 듯 하다

 

어쨌든 otool -l 을 통해 로딩된 링크들을 확인해보면..

뭔가 이것저것 많긴한데 쨋든 rpath는 없다

 

그럼 rpath를 추가해주려면??

https://80000coding.oopy.io/4c67b8c9-53df-4afa-8f4f-9fe0094a4a6e

 

공유 라이브러리를 링크하는 방법

 

80000coding.oopy.io

install_name_tool -add_rpath <new> <file> 을 통해 rpath를 추가해줄 수 있다.

 

그렇다면... 

빌드 후 생성된 파일에 따로 rpath를 추가해준다면??

 

우하하

잘 실행된다! ^_^

 

그런데 또 문제가 있다면..

솔직히 매번 빌드할때마다 이렇게 터미널켜서 명령어를 일일히 입력해 주기도 쉽지않다..

(귀찮으니깐..)

 

아니 왜 애초에 갑자기 rpath가 안들어가는지 잘 모르겠긴한데..

쨋든 vscode task에서 빌드할때 특정 명령어를 실행할 수 있다고 한다.

{
        "label": "add_rpath",
        "type": "shell",
        "command": "install_name_tool",
        "args": [
            "-add_rpath",
            "/usr/local/lib",
            "${workspaceFolder}/src/main"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        },
        "presentation": {
            "reveal": "silent"
        },
        "problemMatcher": []
}

tasks.json에 이렇게 작성해주고

dependsOn? 인가 이걸 사용해줘서

빌드한 뒤에 이걸 실행시키도록 했다.

{
        "label": "Build",
        "dependsOrder": "sequence",
        "dependsOn" :["cppbuild","add_rpath"],
        "group": {
            "kind": "build",
            "isDefault": true
        }
}

 

이렇게 해주면..

정상적으로 실행된다.

휴~