여러 C/C++ 라이브러리를 하나로 결합하는 방법은 무엇입니까?
문제
내 프로젝트에 10개의 링크 라이브러리를 추가하거나 그 중 8개를 내 라이브러리를 사용하도록 요구하는 데 지쳤습니다.libpng.a, libz.a, libjpeg.a와 같은 기존 라이브러리를 가져와 하나의 단일 .a 라이브러리로 결합하고 싶습니다.그게 가능합니까?.lib 라이브러리를 결합하는 것은 어떻습니까?
해결책
Unix 계열 시스템에서는 ld 및 ar 유틸리티가 이를 수행할 수 있습니다.확인해 보세요 http://en.wikipedia.org/wiki/Ar_(유닉스) 또는 Linux 상자나 Google을 통해 매뉴얼 페이지(예: 'unix man ar')를 찾아보세요.
공유(동적) 라이브러리에 연결하는 것이 더 나을 수도 있습니다.이렇게 하면 실행 파일에 종속성이 추가되지만 특히 그래픽 응용 프로그램을 작성하는 경우 크기가 크게 줄어듭니다.
다른 팁
다음을 사용하여 각 라이브러리에서 개체 파일을 추출할 수 있습니다.
ar x <library name>
그런 다음 그것들을 모두 새로운 라이브러리에 병합합니다.
ar cs <new library name> <list each extracted object file>
Linux, MinGW 또는 Cygwin에서 GNU 툴체인 사용:
ar -M <<EOM
CREATE libab.a
ADDLIB liba.a
ADDLIB libb.a
SAVE
END
EOM
ranlib libab.a
아니면 존재감을 유지할 수 있다면 liba.a
그리고 libb.a
:
ar crsT libab.a liba.a libb.a
Windows에서 MSVC 도구 체인을 사용하는 경우:
lib.exe /OUT:libab.lib liba.lib libb.lib
제가 오해하고 있는 것일 수도 있지만, 최종 사용자 코드가 libs를 직접 호출하는 경우에만 libs를 배송하면 되는 것 아닌가요?Jpeg 메서드 등에 대한 모든 액세스가 정적 라이브러리의 코드에서 나온 경우 libs를 lib에 연결하기만 하면 됩니다.
즉.
----------------
| End-user exe |
----------------
|
| makes calls to
|
v
--------------------
| Your static lib.a |
--------------------
| makes calls to and links
v
------------------------------------ .....
| | |
------------- -------- ----------
| libjpeg.a | |libz.a| |libpng.a|
------------- -------- ----------
즉, 최종 코드가 libz.a, libpng.a 등을 직접 호출해야 하는 경우에만 문제가 됩니다.
예를 들어, 앱 코드가 libz.a를 호출해야 하는 적법한 요구가 있는 경우 위에서 언급한 대로 동적 모듈을 사용하는 경우가 됩니다.
추신:아티스트 배지를 받을 수 있나요?:)
물리적으로 단일 파일로 결합하는 방법을 잘 모르겠지만 일종의 추상화를 사용하여 원하는 모든 것을 포함하는 단일 "AllMyLibs.a/h"를 포함할 수 있습니다.컴파일러가 라이브러리를 검색하는 위치에 이를 배치할 수도 있으므로 모든 프로젝트에서 작동합니다.
추신- 궁금해서, 단일 라이브러리를 포함하는 것을 싫어하는 이유는 무엇입니까?
여러 타사 라이브러리를 하나로 결합하면 더 많은 문제가 발생할 수 있습니다. 예를 들어 해당 라이브러리 중 두 개가 프로그램에서 사용하지 않는 공통 기호를 정의하는 경우입니다.이제 라이브러리를 결합하기 전에 공통 기호의 인스턴스 전체(또는 하나만 제외)를 추출해야 합니다.