g ++로 정적 라이브러리를 만드는 방법은 무엇입니까?


101

누군가 .cpp 및 .hpp 파일에서 정적 라이브러리를 만드는 방법을 알려주시겠습니까? .o 및 .a를 만들어야합니까? 또한 정적 라이브러리를 컴파일하고 다른 .cpp 코드에서 사용할 수있는 방법을 알고 싶습니다. 내가 가진 header.cpp, header.hpp .내가 만들고 싶습니다 header.a. 에서 header.a를 테스트합니다 test.cpp. 컴파일을 위해 g ++를 사용하고 있습니다.


3
@NeilButterworth의 답변 (또는 다른 답변)을 받아 주시겠습니까?
einpoklum

답변:


110

.o 파일을 만듭니다.

g++ -c header.cpp

이 파일을 라이브러리에 추가하고 필요한 경우 라이브러리를 만듭니다.

ar rvs header.a header.o

사용 라이브러리 :

g++ main.cpp header.a

3
g ++ test.cpp header.a -o test, no?
linuxx

11
@unapersson : 왜? 실행 파일이 형식 이 아니므a.out오해의 소지가 있습니다. 왜 "절대"라는 실행 파일을 생성하지 않아야 test합니까?
밝기 경주 궤도에

5
@Tomalak Geret'kal : 나는 이것이 test시스템 명령 이라는 사실과 관련이 있다고 생각합니다 . 그러나 테스트 프로그램은 일반적으로 시스템 bin 디렉토리에 설치 ./test되지 않으며 작성하도록 요구하기 때문에 나에게도 그다지 문제가되지 않습니다 ...
ereOn

10
@unapersson : 아니요. 제가 말한 내용을 정확히 말하고 있습니다. 실행 파일은 더 이상 a.out형식으로 생성되지 않지만 이름은 레거시 이유로 남아 있습니다. (그리고 당신의 문제가 제대로 후 쉘을 사용하는있는 거없는 경우는. 나는 현재 디렉토리에서 실행 파일을 실행하는 방법을 하나 알고에 대한 test것입니다 당신만큼, 실행 파일 이름에있는 거 쓰기 단지 빠른 테스트 물론 스 니펫.)
궤도의 Lightness Races

4
실행 파일의 이름을 지정하는 test것은 제가 후회하기 어려운 방법을 배웠으며 "쉘을 완벽하게 사용할 수 있습니다". 그것은 나쁜 생각이고, 나는 그것이 "껍질을 완벽하게 사용할 수있는"다른 많은 사람들에게 물린 것을 보았다.
James K. Polk 회장

46

다음 과 같이 유틸리티를 .a사용하여 파일을 만들 수 있습니다 ar.

ar crf lib/libHeader.a header.o

lib모든 라이브러리를 포함하는 디렉토리입니다. 이러한 방식으로 코드를 구성하고 코드와 개체 파일을 분리하는 것이 좋습니다. 모든 것을 하나의 디렉토리에 두는 것은 일반적으로 추악 해 보입니다. 위의 줄은 libHeader.a디렉토리에 생성 됩니다 lib. 따라서 현재 디렉토리에서 다음을 수행하십시오.

mkdir lib

그런 다음 위의 ar명령을 실행하십시오 .

모든 라이브러리를 링크 할 때 다음과 같이 할 수 있습니다.

g++ test.o -L./lib -lHeader -o test  

-L플래그는 얻을 것이다 g++추가 할 lib/경로에 디렉토리를. 이렇게하면 g++을 찾을 때 검색 할 디렉토리를 알 수 libHeader있습니다. -llibHeader링크 할 특정 라이브러리에 플래그를 지정합니다.

test.o는 다음과 같이 생성됩니다.

g++ -c test.cpp -o test.o 

2
lib / libHeader.a는 무엇입니까? ar rcs ... ar crf보다 낫지 않습니까?
linuxx

1
@linuxx : main.o는 main.cc에서 생성 한 객체 파일입니다.
Sriram

@linuxx : ar 유틸리티와 함께 ​​사용하는 정확한 플래그는 요구 사항에 따라 결정됩니다. ar에 대한 man 페이지를 찾는 것이 좋습니다.
Sriram

test.cpp를 사용하여 라이브러리를 테스트하는 방법은 무엇입니까?
linuxx

19
-lHeader대신 그렇지 -llibHeader않습니까?
Dolanor

30

누군가 .cpp 및 .hpp 파일에서 정적 라이브러리를 만드는 방법을 알려주시겠습니까? .o 및 .a를 만들어야합니까?

예.

.o 만들기 (일반적으로) :

g++ -c header.cpp

아카이브 만들기 :

ar rvs header.a header.o

테스트 :

g++ test.cpp header.a -o executable_name

모듈이 하나만있는 아카이브를 만드는 것은 약간 무의미 해 보입니다. 다음과 같이 쉽게 작성할 수 있습니다.

g++ test.cpp header.cpp -o executable_name

그럼에도 불구하고 실제 사용 사례가 더 많은 모듈과 함께 조금 더 복잡하다는 의심의 이점을 줄 것입니다.

도움이 되었기를 바랍니다!


1
여러 모듈을 어떻게 포함합니까?
Sidhin S 토마스

2
잘 했어! 때때로 우리 ranlib는 GNU에서 단순히 ar s.
Viet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.