2010-07-10 3 views
3

저는 Linux와 Eclipse를 사용하고 있습니다.
라이브러리 (Box2D)를 사용하고 싶습니다. 나는 lib-file "libBox2D.so.2.1.0"을 가지고있다. 내 프로젝트 폴더의 자체 제작 된 lib 폴더 (실행 파일의 작업 디렉토리이기도 함)에 넣습니다.
-lBox2D을 링커 명령 줄 인수에 추가했습니다. (즉, Eclipse GUI에서 라이브러리로 "Box2D"를 추가했다는 의미입니다.)C++ : 내 프로젝트 폴더에있는 라이브러리를 연결하는 방법은 무엇입니까?

하지만 그것을 실행하려고하면, 내 응용 프로그램의 인쇄를 automaticly 그는 다음과 같은 메시지와 함께 "libBox2D.so.2.1.0"라이브러리 파일을 찾을 수는 :

error while loading shared libraries: libBox2D.so.2.1.0: cannot open shared object file: No such file or directory

나는 그가 /usr/lib/에서이 라이브러리를 검색 생각 .. ..

그래서 : 내 응용 프로그램이 상대 경로 "lib/libBox2D.so.2.1.0"에서 라이브러리를 검색해야한다는 것을 컴파일러/링커/"무엇이든지 알아야 할 필요가 있습니다"라고 어떻게 말할 수 있습니까? 작업 디렉토리)?

미정 : 문제가 Box2D의 (여기에 위의 링크)의 다운로드 페이지에 해당 될 수 있습니다, 그들은 그것을 버전 2.1.2이고 (나는 불리는으로 보면) 해당 라이브러리 버전 2.1.0라고?

PS : 나는 또한 내 프로젝트 폴더의 루트에 넣어려고했는데, 그것은 어떤 도움을 매우 극명하게 될 것이다

... 성공하지 못했습니다.
감사합니다.

답변

2

LD_LIBRARY_PATH 환경 변수를 설정해야합니다.

일반적으로 제품을 배송 할 필요는 없지만 개발에는 '괜찮습니다'라고 덧붙여 야합니다. Why LD_LIBRARY_PATH is bad을 읽으십시오.

그리고 약간의 배경 지식을 필요로하는 "로더"입니다. 따라서 을 실행하기 전에 프로그램을 실행하여으로 설정하십시오.

  1. 사용자가 컴파일합니다.
  2. 링크는 공유 라이브러리이므로 모든 기호가 삽입되지는 않습니다.
  3. 이제 실행할 공유 라이브러리에 의존하는 실행 파일이 있습니다.
  4. 실행 파일을 실행하면 프로그램을 시작하기 전에 로더가 모든 공유 라이브러리를로드합니다.
  5. 라이브러리를 찾을 수 없으면 이전에 본 오류로 프로그램이 중단됩니다.
  6. LD_LIBRARY_PATH을 설정하여 검색 할 경로 목록을 지정할 수 있습니다.

이처럼 사용

export LD_LIBRARY_PATH=/path/to/dir 
./path/to/executable 
+0

+1 : 편집 해 주셔서 감사합니다. –

+0

@ D.Shawley : 그 종이는 실제로 내 첫 번째 링크에서 링크되었습니다 ...하지만 나는 누군가를 알았습니다 :) – Stephen

+0

나는 그 열쇠가 그 로더라고 생각합니다. 보통의 방법으로 공유 객체를 찾을 수 없을 때만'LD_LIBRARY_PATH'가 필요합니다. 표준 시스템 위치에 라이브러리를 설치하기 전에 사용되는 받침대입니다. –

3

방금 ​​한 후 개발하는 동안 LD_LIBRARY_PATH를 사용하여, 새로운 라이브러리를 시도하는 경우가 괜찮습니다. 실제로 이것은 이 가장 적절하며의 사용은 LD_LIBRARY_PATH입니다. 공유 구성 요소를 설계하고 배포하는 방법에 대한 조언을 찾고 있다면 계속 읽어보십시오.

응용 프로그램이 응용 프로그램과 관련된 위치에서 공유 라이브러리를로드하는 것이 목적이라면 런타임 링크 경로 정보를 링크 할 때 실행 파일에 추가해야합니다. 로드 된 런타임은 응용 프로그램이로드 될 때 공유 및 종속 오브젝트를 찾는 데 몇 가지 다른 메커니즘을 사용합니다.

  • 가장 일반적인 방법은 공유 라이브러리의 전체 경로 이름을 포함시키는 것입니다. 이것은 대부분의 링커가 기본적으로하는 일입니다.
  • 또 다른 방법은 라이브러리 이름 만 포함하고 로더 검색을 런타임 경로 (예 : ldconfig, LD_LIBRARY_PATH으로 구성된 구성 요소 등)로 구성하는 것입니다. 당신이 찾고있는
  • 방법은 마지막 옵션은 OS와 컴파일러의 선택에 따라 다르게 구현 상대 런타임 검색 경로

을 인코딩하는 것입니다. 리눅스 박스에서 GNU 툴체인을 사용하고있는 것 같기 때문에 ld -rpath 옵션을 살펴보십시오. 거기에 몇 가지 좋은 예가 있습니다 - Avoiding LD_LIBRARY_PATHld -rpath '$ORIGIN/../lib'을 옵션으로 언급하며 Dynamic Libraries, RPATH, ...은 런타임 경로 구성과 관련된 흥미로운 정보를 다룹니다.

관련 문제