2010-11-30 6 views
3

기본적으로 내가하고 싶은 것은 이것이다 :기존 .a 파일에 있습니까?

내가 객체와 다른 정적 라이브러리에 정적 라이브러리를 모두 보관할
gcc foo.c -o foo.o 
ar rcs foo.a foo.o 
gcc bar.c -o boo.o 
ar rcs bar.a bar.o foo.a 

. 불행하게도, 마지막 명령은 foo.o (bar.o와 foo.a가 포함되어 있음)를 포함하지 않으므로 링크 단계에 도달하면 링커는 foo.o에서 심볼을 찾을 수 없습니다.

내가 원하는 것을 할 수있는 방법이 있습니까? 나는이 모든 일을하고있어, 그래서 나는 & 객체를 재 아카이브하는 것을 포함하지 않는 해결책을 찾고있다. (다소 고통 스럽다). 이런 종류의 "다른 아카이브에서 보관"설정 작업을 할 수있는 방법이 있습니까? 당신이 원래의 형태를 유지하기 위해 필요하지 않은 경우

답변

3

사실, 전체 '.a'파일을 다른 파일에 보관하고 싶지는 않습니다. 한 아카이브의 구성원을 다른 아카이브에 보관할 수도 있지만 완전히 다른 작업입니다.

'ar'프로그램은 소스 파일, gzip 된 tar 파일, HTML 파일, XML 파일 및 거의 모든 다른 유형의 파일을 '.a'(그리고 '.a'접미어는 오직 전통적이며 필수는 아님) - 어느 정도 시도해보십시오. 그러나, 오브젝트 파일 (및 오브젝트 파일 만)을 특별히 처리하여 링커 ('ld')가 사용할 수있게하지만 링커는 확장자가 '.a'인 경우에만 이러한 파일을 사용합니다. 당신이 제안으로 일을하고 추출의 foo.a

짧은에서

  1. foo.a 단지 foo.o
  2. bar.abar.o를 포함 포함 된 모든 개체 :

    그래서, 당신은 두 개의 라이브러리를 갖고 싶어 객체가 foo.a 인 경우 bar.a에 추가하면 유일한 대안은 foo.a 너무 bar.a의 구성원으로 :

    FOO_OBJS = foo.o 
    BAR_OBJS = bar.o $(FOO_OBJS) 
    
    foo.a: $(FOO_OBJS) 
        $(AR) $(ARFLAGS) [email protected] $(FOO_OBJS) 
    bar.a: $(BAR_OBJS) 
        $(AR) $(ARFLAGS) [email protected] $(BAR_OBJS) 
    

    나는 당신의 예를 최소화하는 것이 가정입니다. 그렇지 않다면 왜 두 개의 라이브러리로 귀찮을까요? foo.o의 코드를 사용하는 코드는 bar.a가 링크되어 있어도 foo.o 만 연결합니다. (이것들이 공유 객체라면 약간 다르 겠지만 두 개의 공유 객체보다는 하나만 사용하는 것이 더 나을 것입니다.)

2
ar rcs foo.a foo.o 
cp foo.a foo2.a 
gcc -c bar.c 
ar rs foo2.a bar.o 

그리고 아마도 foo.a 대신 foo2.a를 사용합니다.

관련 문제