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에서는 지원되지 않습니다. 사실 이것은 내가 알고있는 기존 컴파일러 / 링커에서 지원되지 않습니다.
참고 URL : https://stackoverflow.com/questions/725472/static-link-of-shared-library-function-in-gcc
'programing tip' 카테고리의 다른 글
Java가 정적 초기화 블록에서 확인 된 예외를 발생시키지 않는 이유는 무엇입니까? (0) | 2020.07.06 |
---|---|
GitHub 위키를 어떻게 복제합니까? (0) | 2020.07.06 |
Zip 폭탄은 어떻게 만드나요? (0) | 2020.07.06 |
안드로이드 : 드로어 블 또는 배경 이미지를 스케일 하시겠습니까? (0) | 2020.07.06 |
자식 주제 분기 란 무엇입니까? (0) | 2020.07.06 |