2011-01-07 3 views
20

그램 ++ (우분투/리나 4.4.4-14ubuntu5)는 I라고 sdpAPI.a 다음 정적 라이브러리가 4.4.5"정의 참조"정적 라이브러리

대해 연결. 테스트 응용 프로그램과 연결하는 데 문제가 있습니다. 내가 뭔가 잘못하고 있는지 궁금해. 정적 라이브러리는 g ++로 빌드되었습니다.

/projects/unit_test/main.c 
/projects/unit_test/sdp/inc/sdpAPH.h 
/projects/unit_test/sdp/lib/sdpAPI.a 

내 소스 코드는 다음과 같습니다 :

#include <stdio.h> 

#include "sdpAPI.h" 

int main(void) 
{ 
    printf("----- TEST SDP ------\n"); 

    try { 
     sdpSessionDescription sdp; 
     sdp.clear(); 
    } 
    catch(...) { 
     printf("----- TEST FAILED --------\n"); 
     return 0; 
    } 

    printf("------ TEST SUCCESSFULL ------\n"); 

    return 0; 
} 

을 그리고 내 메이크 파일이 있습니다 :

OBJECT_FILES = main.o 
CC = g++ 
CFLAGS = -Wall -Wextra -Wunreachable-code -ggdb -O0 
TARGET = sdp_demo 

INC_PATH = -I sdp/inc 
LIB_PATH = -L sdp/lib/sdpAPI.a 

$(TARGET): $(OBJECT_FILES) 
$(CC) $(CFLAGS) $(INC_PATH) $(LIB_PATH) $(OBJECT_FILES) -o $(TARGET) 

main.o: main.c 
$(CC) $(CFLAGS) $(INC_PATH) $(LIB_PATH) -c main.c 

clean: 
rm -f $(TARGET) $(OBJECT_FILES) *~ 

이는 내가 링커 오류는 다음과 같이

내 디렉토리입니다 점점 :

어떤 제안에 대한 78,

많은 감사,

답변

37

-L 라이브러리 경로이 아닌 특정 라이브러리를 지정해야합니다. -L sdp/lib -l sdpAPI 경로를 모두 지정해야 할 것입니다.

라이브러리 이름 앞에 lib.a 또는 .sl (또는 이와 유사한 것)을 붙이고 붙이려고 시도하지만.

그래서 당신은 또한 GCC 맨에 따라 libsdpAPI.a에 라이브러리 이름을 변경해야 할 수도 있습니다

-l xyz
          링커가 라이브러리 디렉토리의 표준 목록을 검색, 이는 실제로 libxyz.a이라는 파일


또한 명심 명령 줄 문제에 사물의 순서. $(CC) $(CFLAGS) $(INC_PATH) $(LIB_PATH) $(OBJECT_FILES) -o $(TARGET) (오브젝트 이전의 라이브러리)을 수행하면 라이브러리를 나열하는 시점에 미해결 된 기호가 없기 때문에 라이브러리에서 아무것도 가져 오지 않습니다.

그런 다음 마지막으로 개체를 가져 오면 (0123) 해결되지 않은 기호로 인 채로 남아 있습니다. 이후에 나열된 라이브러리가 없기 때문입니다.

당신은 일반적으로 오브젝트 후 라이브러리를 수행해야합니다

$(CC) $(CFLAGS) $(INC_PATH) $(OBJECT_FILES) $(LIB_PATH) -o $(TARGET) 

모든 해결되지 않은 기호 라이브러리를 확인하기 전에 알려진하고 있는지 확인할 수도 있습니다.

다른 문제 (예 : 다른 방법으로 해결할 수있는 상호 의존 라이브러리)를 찾지는 않지만 개체의 확인되지 않은 모든 기호가 라이브러리를보기 전에 알 수 있도록합니다. man 페이지의 같은 섹션에서

은 위에서 인용

그것은 명령에이 옵션을 쓰기 차이가; 링커는 라이브러리와 오브젝트 파일을 지정된 순서대로 검색하고 처리합니다. 따라서 foo.o -lz bar.ofoo.o 파일 다음에 bar.o 앞에 라이브러리 z을 검색합니다. bar.oz의 함수를 참조하면 해당 함수가로드되지 않을 수 있습니다.

+0

정적 라이브러리를 다음에 복사했습니다 : libsdpAPI.a와 다음 행을 편집했습니다. LIB_PATH = -L sdp/lib -l sdpAPI. 그러나, 나는 여전히 정의되지 않은 동일한 참조를 얻고있다. 감사. – ant2009

+0

@ ant2009 주문이 중요하기 때문입니다. 업데이트 된 답변을 참조하십시오. – paxdiablo

+0

감사합니다. 나는 그것을 잘못 주문했다. 나는 공유하는 일에 너무 익숙하다. 나는 정적 인 순서에 대해 몰랐다. 감사. – ant2009

10
  • -L 도서관 경로 지정하는 데 사용됩니다 : - Ldir디렉토리 목록에 dir 디렉토리를 추가 검색 할

    을 - 엘.

  • -l 당신이에 연결하는 라이브러리 지정해야 할 것입니다 :

    -l라이브러리링크 할 때 라이브러리라는 이름의 라이브러리를 검색 할 수 있습니다.

당신은 아마 -L sdp/lib/ -l sdpAPI

+0

또한 어딘가에 문서화되어있는 이유는 모르겠지만 g ++/gcc는 libs 순서가 잘못되었을 때 당황 할 수 있습니다. –

1

-l 및 -static과 같은 옵션이 정확히 나를 혼란스럽게 만들었습니다. 마침내 온라인에서 찾을 수없는 세부 정보를 얻으려는 사람 gcc를 작성했습니다. 희망이 다른 사람도 도움이 되길 바랍니다

- 도서관 -l 도서관 연결시 라이브러리라는 라이브러리를 검색하십시오. (별도의 인수로 라이브러리와 두 번째 대안은 POSIX 호환 용이며 권장하지 않습니다.) 동적 링크를 지원하는 시스템에

 It makes a difference where in the command you write this option; 
     the linker searches and processes libraries and object files in the 
     order they are specified. Thus, foo.o -lz bar.o searches library z 
     after file foo.o but before bar.o. If bar.o refers to functions in 
     z, those functions may not be loaded. 

     The linker searches a standard list of directories for the library, 
     which is actually a file named liblibrary.a. The linker then uses 
     this file as if it had been specified precisely by name. 

     The directories searched include several standard system 
     directories plus any that you specify with -L. 

     Normally the files found this way are library files---archive files 
     whose members are object files. The linker handles an archive file 
     by scanning through it for members which define symbols that have 
     so far been referenced but not defined. But if the file that is 
     found is an ordinary object file, it is linked in the usual 
     fashion. The only difference between using an -l option and 
     specifying a file name is that -l surrounds library with lib and .a 
     and searches several directories. 

-static ,이 공유 라이브러리와 링크 방지 할 수 있습니다. 다른 시스템에서는이 옵션이 적용되지 않습니다.

 This option will not work on Mac OS X unless all libraries 
     (including libgcc.a) have also been compiled with -static. Since 
     neither a static version of libSystem.dylib nor crt0.o are 
     provided, this option is not useful to most people. 

-Ldir 는 -l 검색 할 디렉토리 목록에 dir 디렉토리를 추가합니다.

-Ldir -lLIB -static

정적 라이브러리와 링크 할 때문에

, 당신은 세 번째 플래그가 필요합니다

-1

세 플래그 당신은 알 필요가있다. 그렇지 않으면 동적 라이브러리로 연결됩니다.

관련 문제