[linux] gcc에서 공유 라이브러리 함수의 정적 링크

gcc에서 공유 라이브러리 함수를 정적으로 링크하려면 어떻게해야합니까?



답변

인용하다:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

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에서는 지원되지 않습니다. 사실 이것은 내가 알고있는 기존 컴파일러 / 링커에서 지원되지 않습니다.


답변