[linux] gcc에서 공유 라이브러리 함수의 정적 링크
gcc에서 공유 라이브러리 함수를 정적으로 링크하려면 어떻게해야합니까?
답변
인용하다:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
라이브러리를 연결하려면 정적 버전의 라이브러리가 필요합니다.
공유 라이브러리는 실제로 진입 점이 지정된 특수 형식의 실행 파일입니다 (일부 문제 해결 포함). 정적으로 연결하는 데 필요한 모든 정보가 없습니다.
공유 라이브러리를 정적으로 링크하거나 정적 라이브러리를 동적으로 링크 할 수 없습니다.
플래그 -static
는 링커가 공유 라이브러리 (.so) 대신 정적 라이브러리 (.a)를 사용하도록합니다. 그러나 정적 라이브러리가 항상 기본적으로 설치되는 것은 아니므로 정적 라이브러리를 직접 설치해야 할 수도 있습니다.
또 다른 가능한 방법은 statifier 또는 Ermine 을 사용하는 것 입니다. 두 도구 모두 동적으로 연결된 실행 파일을 입력으로 사용하고 출력으로 모든 공유 라이브러리가 포함 된 자체 포함 된 실행 파일을 생성합니다.
답변
libapplejuice를 정적으로 연결하고 싶지만 liborangejuice와는 연결 하지 않으 려면 다음과 같이 연결할 수 있습니다.
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
유의할 점은있다 – 경우에 liborangejuice
사용이 libapplejuice
다음 libapplejuice
동적으로도 연결됩니다.
liborangejuice
정적으로 libapplejuice
얻으려면 libapplejuice
정적 으로 링크해야합니다 .
그리고 그렇지 않으면 유지 -Wl,-Bdynamic
하는 것이 libc
좋지 않은 것을 포함하여 모든 것을 정적으로 연결하는 것을 잊지 마십시오.
답변
공유 라이브러리 (.so)의 .a 파일이 있으면 다음과 같이 객체 파일처럼 전체 경로와 함께 간단히 포함시킬 수 있습니다.
다음과 같이 컴파일하여 main.o를 생성합니다.
gcc -c main.c
그러면 해당 객체 파일을 해당 정적 라이브러리와 연결하고 실행 파일 ( “main”)을 만듭니다.
gcc main.o mylibrary.a -o main
또는 단일 명령으로 :
gcc main.c mylibrary.a -o main
또한 절대 또는 상대 경로 일 수 있습니다.
gcc main.c /usr/local/mylibs/mylibrary.a -o main
답변
예, 이것이 8 살짜리 질문이라는 것을 알고 있지만 공유 객체 라이브러리에 정적으로 링크 할 수 있다는 말을 들었습니다. 이것은 문자 그대로 그것에 대한 자세한 정보를 검색했을 때 가장 큰 인기를 얻었습니다.
실제로 정적 공유 객체 라이브러리를 연결하는 것을 증명하는 것은 불가능합니다 ld
( gcc
의 링커) – 그것은 불가능하다고 주장 명에 불과 무리에 반대 – 다음 사용 gcc
명령을 :
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(물론 당신은 컴파일해야합니다 objectname.o
에서 sourcename.c
, 당신은 아마뿐만 아니라 자신의 공유 객체 라이브러리를 구성해야합니다. 당신이 경우에 사용 -Wl,--library-path,.
하는 LD 때문에 로컬 디렉토리에 라이브러리를 찾을 수 있습니다.)
실제 오류는 다음과 같습니다.
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
희망이 도움이됩니다.
답변
조금 늦었지만 … 나는 몇 년 전에 저축 한 링크를 발견했으며 그것이 당신에게 유용 할 것이라고 생각했습니다.
CDE : 휴대용 Linux 응용 프로그램 자동 생성
http://www.pgbovine.net/cde.html
- 그냥 프로그램을 다운로드하십시오
-
이식 할 바이너리 이름을 인수로 전달하여 바이너리를 실행하십시오 (예 : nmap).
./cde_2011-08-15_64 비트 nmap
프로그램은 nmap 및 그 종속 항목에 연결된 모든 라이브러리를 읽고 cde-package / 라는 폴더 (현재와 같은 디렉토리)에 모든 라이브러리를 저장합니다 .
- 마지막으로 모든 시스템에 폴더를 압축하고 이식 가능한 바이너리를 배포 할 수 있습니다.
이식 가능한 프로그램을 시작하려면 cde-package / nmap.cde 에있는 바이너리를 실행해야합니다.
친애하는
답변
gcc에서는 지원되지 않습니다. 사실 이것은 내가 알고있는 기존 컴파일러 / 링커에서 지원되지 않습니다.