문제

나는 .so 라이브러리를 만들고 있고 궁금한 점이 있었다 -B/W -H와 -O CC Complier 옵션 차이는 무엇입니까 (Sun Studio C ++ 사용)?

출력 파일의 이름과 같은 것을 언급하지 않습니까?

도움이 되었습니까?

해결책

-o 컴파일러가 디스크에 기록 할 파일 이름입니다.

-h 이 파일과 연결되는 Elf Binaries에서 녹음 될 이름입니다.

하나의 일반적인 용도는 라이브러리 마이너 버전 번호를 제공하는 것입니다. 예를 들어, 공유 라이브러리 Libfoo를 만들면 다음과 같습니다.

cc -o libfoo.so.1.0 -h libfoo.so.1 *.o
ln -s libfoo.so.1.0 libfoo.so.1
ln -s libfoo.so libfoo.so.1

그런 다음 Hello World 앱을 컴파일하고

cc -o hello -lfoo

Hello의 엘프 바이너리는 a NEEDED 진입 libfoo.so.1 (실행하여 볼 수 있습니다 elfdump -d hello ).

그런 다음 나중에 새로운 기능을 추가해야 할 때 -o 가치libfoo.so.1.1 그러나 -H를 그대로 두십시오 libfoo.so.1 - 이미 1.0으로 만든 모든 프로그램은 여전히로드를 시도합니다. libfoo.so.1 런타임에서 재건되지 않고 계속 작동하지만 LS를 통해 1.1이라는 것을 알 수 있습니다.

이것은 또한 런타임에 사용되는 것과 동일한 디렉토리에 라이브러리를 구축 할 때 때때로 사용됩니다. 별도의 설치 디렉토리가 없거나 포장 시스템을 통해 설치하지 않으면 설치가 발생합니다. 라이브러리 바이너리를 덮어 쓸 때 실행되는 충돌 프로그램을 피하고 건물 중간에있을 때 프로그램이 시작될 수없는 프로그램을 피하기 위해 일부 Makefiles는 다음과 같습니다.

cc -o libfoo.so.1.new -h libfoo.so.1 *.o
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1

(X의 Old Imake Makefile 생성기에 의해 제작 된 MakeFiles는 일반적 으로이 작업을 수행합니다.)

다른 팁

그들은 다른 이름을 언급하고 있습니다. 구체적으로, -o 옵션은 파일입니다 실제 이름 - 파일 시스템의 이름. 그만큼 -h 옵션을 설정합니다 내부 DT_SONAME 최종 객체 파일에서. 이것은 공유 객체가 다른 모듈에 의해 내부적으로 참조되는 이름입니다. 나는 그것이 당신이 달릴 때도 볼 수있는 이름이라고 생각합니다. ldd 그것에 연결되는 개체에서.

-o 옵션은 출력 파일의 이름을 지정하고 -h 옵션은 라이브러리 내부에서 본질적인 이름을 설정합니다. 이 고유 이름은 동적 로더에서 사용될 때 파일 이름보다 우선하며 사전 정의 된 규칙을 사용하여 올바른 라이브러리를 살펴볼 수 있습니다.

해당 명령을 통해 주어진 라이브러리에 내재 된 이름이 무엇인지 알 수 있습니다.

elfdump -d xxx.so | Grep Soname

자세한 내용은 여기를 참조하십시오.

http://docs.oracle.com/cd/e23824_01/html/819-0690/chapter4-97194.html

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