2012-06-30 3 views
4

연결을 수행 할 때 g ++에 전달할 플래그를 파악하는 데 어려움을 겪고 있습니다.개체 및 정적 라이브러리 연결

libxxx.a: xxx1.o xxx2.o ... 
    ar rcs [email protected] $^ 
libyyy.a: yyy1.o yyy2.o ... 
    ar rcs [email protected] $^ 
... 

질문 :

내가 지금처럼 여러 정적 라이브러리로 .o 인 생산 파일을 병합, 이후,

CXXFLAGS = -Wall -Wextra -Wconversion -pedantic -std=c++0x -O2 

과 : 기본적으로, 나는이 "표준"플래그와 함께 몇 가지 코드를 컴파일

  • .o 파일을 컴파일 할 때 CXXFLAGS에 -static 플래그를 사용해야합니까?

    LINKER = g++ 
    LIB_DIR = lib/linux 
    SYSTEM_LIBS = -lgmp 
    LDFLAGS = -Wall -L $(OUTPUT_DIR) -L $(LIB_DIR) $(SYSTEM_LIBS) 
    $(LINKER) $^ $(LDFLAGS) -lsvm -lUtils -lKinderedSpirits -o [email protected] 
    
    exe: 
        $(LINKER) o1.o o2.o $(LDFLAGS) -lxxx -lyyy -lzzz -o [email protected] 
    

    질문 : 정적 라이브러리를 만든 후

, 그래서 내가 이것을 사용하는 실행 파일을 구축하기 위해 이러한 라이브러리의 일부와 함께 일부에서는 .o 컴파일 된 파일을 링크 할

- 여기에 -static 플래그를 사용해야합니까? - -Wall이 여기에 의미가 있습니까? 아니면 컴파일하는 데 유용합니까? - 컴파일러에서 권장하는 것과 비슷한 링커에 전달해야하는 다른 "표준"플래그가 있습니까?

또한 연결하는 동안 GMP 라이브러리에서 정의되지 않은 참조에 대한 예외가 발생합니다. 내가 말할 수있는 한 -lgmp가 링커에 보내졌고 시스템에 설치되었다. (나는 명령 행에서 GMP를 사용하는 간단한 hello world를 컴파일 할 수 있었다) libxxx.a libyyy.a libzzz.a는 $ (LIB_DIR)에 있습니다. 어쩌면 GMP 기호가 libxxx.a에서 사용된다는 것을 언급해야합니다.


UPDATE는 :

은 내가 GMP 기호에 대한 정의되지 않은 참조를 해결하기 위해 관리. 문제는 제가 도서관을 배치 한 순서에 기인합니다. 기본적으로, 지정된 here으로, -lgmp 전에 GMP에 의존하는 라이브러리를 참조해야합니다. 어쨌든, 위의 질문에 내 대답 에 대한 답변을 찾고 있습니다.

+0

"정적 라이브러리"라고하면 실제로 ar을 사용하여 .a 정적 라이브러리 파일을 만들었습니다. – loki11

+0

네, 맞습니다. 나는 명확하게하기 위해 질문을 편집 할 것이다. –

답변

2

Q : 여기에서도 -static 플래그를 사용해야합니까? A : 아마도 필요하지 않습니다. 이 플래그는 동적 라이브러리에서 실수로 링크하는 것을 불가능하게합니다.

Q : 여기에 의미가 있습니까? 아니면 컴파일하는 데 유용합니까? A : 컴파일하는 것일뿐입니다. (fyi, 대문자 W 다음에 컴파일하는 동안 모든 경고를 원하는 "모든"종)

Q : 권장되는 것과 유사한 링커에 전달해야하는 다른 "표준"플래그가 있습니까? 컴파일러? A : 알고 있지 않습니다. 여기에서 일반적인 옵션을 찾을 수 있습니다 : http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

붙여 넣으려는 특정 오류가 발생하고 있습니까?

+0

이제 컴파일과 링크가 잘되었지만, 제대로하고 있는지 확인하고 싶었습니다. 링크에 관해서는 고마워. 구글을 직접 사용할 수는 있지만 링커 플래그가 "표준"으로 간주되고 필자가 언급 한 컴파일러 플래그와 같이 항상 (거의) 반드시 사용해야하는 평신도 가이드가 있는지 궁금하다. –

+0

까지 사용했습니다. – loki11

+1

일반적으로 명령 줄 인수는 컴파일러에게 원하는 것을 알려주는 데 사용됩니다. 당신이 원하는 것을 당신이 스스로 알지 못한다면 그것은 그 것입니다. 특정 깃발에 대한 이유가 있거나 그렇지 않습니다. 네가 그렇게한다면, 너는 알지. 그렇지 않다면 왜 그걸 만들까요? 어쩌면 gcc 맨 페이지를 뒤져서 거기에 무엇이 있는지 파악할 수있을 것입니다. –

관련 문제