[질문] 라이브러리 링킹과 아키브 병합의 차이
글쓴이: partout / 작성시간: 화, 2003/04/22 - 7:34오후
아래 어떤 글을 보니깐...
Quote:
1. gcc -o tcp2 tcp2.c /usr/lib/libnet.a
Quote:
2. gcc -o tcp2 tcp2.c -lnet
'인용 1의 경우 단순히 아키브를 병합하는 것이기 때문에 링킹 작업이 제대로
이뤄지지 않는다. 따라서 일반적으로 이와 같이 쓰지 않고,
인용 2와 같이 쓰는 것이 옳다'라는 글이 있더군요...
그 차이를 좀 자세하게 설명해 주실 수 없을까요?
Forums:
.a를 링킹하면 실행파일 안에 라이브러리의 내용을 넣게 됩니다. 스태틱
.a를 링킹하면 실행파일 안에 라이브러리의 내용을 넣게 됩니다. 스태틱 링크라고 생각하시면 됩니다. ==> 용량이 커지고 공유 라이브러리를 안쓰니 라이브러리가 시스템에 없어도 실행될 수 있습니다.
-l로 링킹하면 윈도에서 dll 링크하는 것 처럼 공유 라이브러리 링크를 하게 됩니다. 나중에 실행 될 때 시스템에 있는 라이브러리 파일을 찾아서 메모리에 같이 올리고 실행하게 됩니다.
rommance.net
제가 쓴 글이군요.
링킹과정에서는(특별히 옵션을 주지 않는한) 두개의 라이브러리를 순서대로 찾습니다. :shock:
우선적으로 shared object라 불리는 lib*.so 들을 찾아서 있으면 이들과 링킹을 합니다. 이들과 링킹되는 경우는 심볼만 가지고 링킹하므로 실행시에 찾아서 라이브러리가 메모리에 로딩됩니다.
근데 이녀석이 없다면 lib*.a 즉, archive라고 불리는 녀석을 찾아서 병합합니다. 이렇게 되면 실행파일의 크기가 커지게 됩니다. 그 차이를 윗분이 간명하게 말씀해주신 것입니다.
어느것이 더 좋다라고는 할 수 없지만, so를 사용하는 것이 실행파일의 크기를 줄일 수 있고, 버전이 크게 바뀌지 않는다면 버전이 올라가는 것에 따라서 성능도 달라질 수도 있고...하핫~ 하여간 so를 사용하시는게 좋습니다.
========================================
* The truth will set you free.
병합은 잘못된 표현이고 정적 링크가 맞는 말입니다.
병합은 잘못된 표현이고 정적 링크가 맞는 말입니다.
먼저 답변 감사 드립니다. ^^근데, 제 질문이 좀 허술했던 모양이네
먼저 답변 감사 드립니다. ^^
근데, 제 질문이 좀 허술했던 모양이네요.
다시 질문 드릴께요.
제가 궁금했던 건...
이전 글들 중에
gcc -o tcp2 tcp2.c /usr/lib/libnet.a
와 같이 아키브를 병합하는 것과
gcc -o tcp2 tcp2.c -lnet (libnet.so가 없는 경우)
을 실행해 libnet.a를 정적으로 링크하는 것이 다르다고 해서...
이것을 확인하려고 했던 겁니다.
원래 질문에서 인용했던 부분 "'인용 1의 경우 단순히 아키브를 병합하는
것이기 때문에 링킹 작업이 제대로 이뤄지지 않는다."라는 말의 뉘앙스가
그렇게 쓰면 문제가 생길 수 있다는 것을 암시하는 것처럼 들렸습니다.
사실 전 정적으로 링크되는 거면.. 둘 사이에 차이가 없는 걸로 알고 있었거든요.
답변 부탁드립니다.
어찌나 졸린지..~~
.so가 없는 상태에서 라이브러리 탐색 경로에 .a만 있으면 그냥 lib
.so가 없는 상태에서 라이브러리 탐색 경로에 .a만 있으면 그냥 libxxx.a라고 쓰는거랑 -lxxx 라고 쓰는거랑 다를게 없습니다.
기본 설정이 .so를 선호하도록 되어 있을 뿐이지요. 이것도 -static 같은 옵션을 주면 바꿀 수 있습니다.
--
익스펙토 페트로눔
댓글 달기