여러 C/C++ 라이브러리를 하나로 결합하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/13128

  •  08-06-2019
  •  | 
  •  

문제

내 프로젝트에 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"를 포함할 수 있습니다.컴파일러가 라이브러리를 검색하는 위치에 이를 배치할 수도 있으므로 모든 프로젝트에서 작동합니다.

추신- 궁금해서, 단일 라이브러리를 포함하는 것을 싫어하는 이유는 무엇입니까?

여러 타사 라이브러리를 하나로 결합하면 더 많은 문제가 발생할 수 있습니다. 예를 들어 해당 라이브러리 중 두 개가 프로그램에서 사용하지 않는 공통 기호를 정의하는 경우입니다.이제 라이브러리를 결합하기 전에 공통 기호의 인스턴스 전체(또는 하나만 제외)를 추출해야 합니다.

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