2012-08-02 4 views
0

첫째, 내가 모두의

내가 코드 :: 블록과 C++에서 응용 프로그램을 구축 ... 내가 여기 올바른 맥락에서 질문을 희망 리눅스에서 C++ 응용 프로그램에 대한 정적 라이브러리의 위치를 ​​지정합니다. 응용 프로그램은 타사에서 제공하는 정적 라이브러리를 사용하며 패키지 관리를 통해 시스템에 설치할 수 없습니다. 그러므로 나는 응용 프로그램을 배포 할 때이 라이브러리를 제공합니다. 여기

내 목표 설정과 같은 모습입니다 :

<Target title="Unix_162"> 
<Option output="bin/my_app" prefix_auto="1" extension_auto="1" /> 
<Option working_dir="/home/marco/third_party_dist/lib" /> 
<Option object_output="obj/Unix_162" /> 
<Option type="1" /> 
<Option compiler="gcc" /> 
<Option use_console_runner="0" /> 
<Option parameters="-c" /> 
<Compiler> 
<Add directory="/home/marco/third_party_dist/include" /> 
</Compiler> 
<Linker> 
<Add library="/home/marco/third_party_dist/lib/lib1.so" /> 
<Add library="/home/marco/third_party_dist/lib/lib2.so" /> 
<!-- some more included the same way --> 
<Add directory="/home/marco/third_party_dist/lib" /> 
</Linker> 
</Target> 

나는이 목표 벌금을 구축하고 실행할 수 있습니다. 모든 것이 작동합니다.

오늘 저는 데비안 스퀴즈 (Debian Squeeze)를 실행하려고 시도했지만 제 3 자의 실행 파일과 라이브러리가 모두 들어있는 폴더를 복사했습니다. 모든 것이 하나의 폴더에있는 한 실행 파일은 .so 파일을 찾습니다. 내가 틀렸어. 코드 :: 블록이 실행에 대한 작업 디렉토리를 설정할 수 있기 때문에

/home/my_app/my_app: error while loading shared libraries: lib1.so: cannot open shared object file: No such file or directory 

내 developement에 시스템에이 메시지가 없습니다 : 나는 메시지가 나타납니다. /etc/ld.so.conf.d/my_app.conf 안에 .so 파일의 위치를 ​​넣어 오류 메시지를 제거 할 수 있습니다 ...

어쨌든 실행 파일을 빌드하여 라이브러리를 검색 할 수 있습니까? 실행 디렉토리에? 아니면 데비안에만 해당되는 문제입니까? 또는 실행 파일을 실행하기 전에 프로세스의 작업 디렉토리를 지정할 수 있습니까?

난 당신이 응용 프로그램을 시작하기 전에 시스템 구성/환경을 변경하는 것을 방지 할 ...

답변

2

첫 번째 점은 정적 라이브러리가 아니기 때문에 공유됩니다.

문제는 런타임에 라이브러리를 찾는 것입니다.
이렇게하는 방법에는 두 가지가 있습니다.

1) LD_LIBRARY_PATH 환경 변수를 설정합니다.
이것은 PATH와 비슷하지만 공유 라이브러리 용입니다.

2) 실행 파일에 rpath를 설정하십시오.
이 공유 libs와이은 (는) 현재 디렉토리에 보이게 .로 설정할 수 있습니다

-Wl,-rpath,<LIB_INSTALL_PATH> 

에 대한 검색을 수있는 실행 파일로 백업 된 경로입니다.
또는 당신이 응용 프로그램이 설치되어있는 디렉토리에 보이게 '$ORIGIN'로 설정할 수 있습니다.

3) 공유 라이브러리의 기본 위치 중 하나에 설치할 수 있습니다.당신은 더 기본 위치
을 추가 할 수 있습니다
/etc/ld.so.conf 내부 모습 있지만, 일반적으로 /usr/lib/usr/local/lib

4) 수정 /etc/ld.so.conf

+0

솔루션 2) 나에게 좋은 소리. 나는 지금이 매개 변수를 어디에 두어야하는지 알지 못한다. 그들을 "다른 링커 옵션"에 넣어야합니까? 실행 전에/실행 전에 전달합니까? –

+0

링크 타임에 전달합니다. g ++/gcc를 사용하여 응용 프로그램을 연결한다고 가정합니다. –

+0

고마워! 나는 Code :: Blocks의 "Other linker options"텍스트 필드에 인수를 전달하고 이것이 링크 타임에 완료되었다고 가정합니다. 내가 데비안 시스템에 응용 프로그램을 복사하고 잘 시작했습니다! –

0

예 거기, 당신은 <path>이 라이브러리의 경로 당신의 링커 옵션 -rpath <path>을 통과해야한다 (유사한에게 옵션 -L으로).

또한 라이브러리는개가 아닌 라이브러리를 공유하고 있습니다.

+0

은 실행 파일에 상대적 일 수 있습니까? 아니면 작업 디렉토리? –

+0

링커의 작업 디렉토리와 관련이 있습니다. – scai

+0

이것은 매개 변수를 전달할 때 발생합니다 : g ++ : error : 인식 할 수없는 옵션 '-R' –

0

I thought that as long as everything is in one folder the executable will find the .so files. I was wrong.

여분의 단계는 동일의 공유 라이브러리를 리눅스 동적 링커 보이게하기 위해 필요 디렉토리를 실행 파일로 사용하십시오. 실행 파일을 -Wl,-rpath,'$ORIGIN' 옵션과 링크하십시오 (메이크 파일 $-Wl,-rpath,'$$ORIGIN'과 같이 인용 부호가 필요합니다). 자세한 내용은 $ORIGIN and rpath note을 참조하십시오.

관련 문제