문제

내가 세 사람이 있다고 가정 해 봅시다 정적 라이브러리가 말합니다 libcolor.a *librgb. *a에 의존합니다. libpixel.a . 도서관 libcolor.a 도서관에 의존한다고합니다 librgb.a 몇 가지 참조가 있기 때문에 libcolor.a 정의 된 일부 기호에 librgb.a. 위의 모든 라이브러리를 새로운 libnewcolor.a 어느 것이 독립적입니까?

독립적 인 것은 새 라이브러리에 모든 기호를 정의해야한다는 것을 의미합니다. 그래서 연결하는 동안 나는 단지 주어야합니다 -lnewcolor. 새 라이브러리의 크기는 최소이어야합니다. 즉, 어떤 기호도 포함해서는 안됩니다. librgb.a 사용되지 않습니다 libcolor.a 등. 나는 다양한 옵션을 사용하여 운을 시도했습니다 AR 명령 (정적 라이브러리/아카이브를 작성하고 업데이트하는 데 사용).

도움이 되었습니까?

해결책

1/ 각 라이브러리에서 모든 객체 파일을 추출합니다 (사용 ar) 그리고 라이브러리 나 객체 파일없이 코드를 컴파일하십시오. 아마도 정의되지 않은 기호의 절대 버킷로드를 얻을 수 있습니다. 정의되지 않은 기호가 없으면 5 단계로 이동하십시오.

2/ 첫 번째 것을 잡고 해당 기호를 만족시키는 객체 파일을 찾으십시오 (사용 nm).

3/ 해당 객체 파일을 기록한 다음 새 개체 파일을 포함하여 코드를 컴파일합니다. 정의되지 않은 기호의 새 목록을 얻거나 없으면 5 단계로 이동하십시오.

4/ 2 단계로 이동하십시오.

5/ 목록의 모든 객체 파일을 단일 라이브러리에 결합합니다 (다시 ar).

쾅! 당신은 그것을 가지고 있습니다. 객체없이 코드를 연결하십시오. ~와 함께 새로운 도서관.

이 모든 것은 쉘 스크립트로 비교적 쉽게 자동화 될 수 있습니다.

다른 팁

GNU 아카이버의 작은 사용 기능은 아카이브 스크립트이며 간단하지만 강력한 인터페이스이며 예를 들어 다음 스크립트를 Script.AR이라고하는 경우 원하는 것을 정확하게 수행 할 수 있습니다.

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
SAVE
END

그런 다음 AR을 다음과 같이 호출 할 수 있습니다.

ar -M < script.ar

그리고 libcolor.a librgb.a 및 libpixel.a의 모든 .o 파일을 포함하는 libnewcolor.a를 얻을 수 있습니다.

또한 AddMod 명령과 함께 일반 .O 파일을 추가 할 수도 있습니다.

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
ADDMOD someRandomCompiledFile.o
SAVE
END

또한 MakeFiles에서 이러한 스크립트를 생성하는 것은 매우 쉽기 때문에 일반적으로 스크립트를 생성하고 스크립트에서 AR을 호출하는 아카이브를 작성하기위한 다소 일반적인 MakeFile 규칙을 만듭니다. 이 같은:

$(OUTARC): $(OBJECTS)
    $(SILENT)echo "CREATE $@" > $(ODIR)/$(ARSCRIPT)
    $(SILENT)for a in $(ARCHIVES); do (echo "ADDLIB $$a" >> $(ODIR)/$(ARSCRIPT)); done
    $(SILENT)echo "ADDMOD $(OBJECTS)" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "SAVE" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "END" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)$(AR) -M < $(ODIR)/$(ARSCRIPT)

지금 내가 그것을 보았지만 $ (객체)가 비어 있으면 작동하지 않는 것 같아요 (예 : 추가 객체 파일을 추가하지 않고 아카이브를 결합하려는 경우) 독자가이를 수정하기 위해 연습으로 남겨 둘 것입니다. 필요한 경우 발행 ... : d

이 기능에 대한 문서는 다음과 같습니다.

https://sourceware.org/binutils/docs/binutils/ar-scripts.html#ar-scripts

정적 라이브러리는 일부 객체 파일 (.O)의 아카이브 이상이 아닙니다. 당신이 할 수있는 일은 두 라이브러리의 모든 객체를 추출한 다음 ( "ar x"사용) "ar"를 사용하여 새 라이브러리에 연결하는 것입니다.

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