2011-12-06 3 views
3

Linux에서 g ++를 사용하여 C++로 작성된 프로그램에 정적 라이브러리의 일부를 연결하려고합니다.C++ 정적 라이브러리의 원하는 부분 만 연결

my_lib.h

#ifdef USE_EXTERN_LIB 
# include <extern_lib.h> 
void do_something (struct extern_lib); 
#endif 

void do_other (int); 

my_lib.c

#include "my_lib.h" 

#ifdef USE_EXTERN_LIB 
void do_something (struct extern_lib l) 
{ 
    // do something 
} 
#endif 

void do_other (int a) 
{ 
    // do something 
} 

내가 정적 그것으로 모두를 포함하는 -DUSE_EXTERN_LIB 프리 프로세서 플래그 libmy_lib.a 만드는거야.

는하지만 내가하고 싶은 것은 두 개의 프로그램을 만드는 것입니다 : * extern_lib *로이 라이브러리를 사용하여 하나 하나 * extern_lib의 *없이 사용, 예 :

g++ -L/path/to/lib -lmy_lib -o prog_wihtout_lib prog_without_lib.cc 
g++ -DUSE_EXTERN_LIB -L/path/to/lib -lmy_lib -o prog_with_lib prog_with_lib.cc 

두 번째 프로그램은 컴파일하지만 첫 번째는 extern_lib이 선언되지 않았다는 것입니다.

동적 라이브러리를 사용하면 심볼이 런타임에로드되기 때문에 아무런 문제가 없지만 정적 라이브러리가 필요합니다. 정적 라이브러리의 모듈 만 연결할 수 있습니까?

편집

prog_without_lib.cc

#include "my_lib.h" 

int main() 
{ 
    do_other (42); 

    return 0; 
} 

prog_with_lib.cc

#include "my_lib.h" 

int main() 
{ 
    do_other (42); 

    struct extern_lib l; 
    do_something (l); 

    return 0; 
} 

감사합니다.

g++ -DUSE_EXTERN_LIB -I/path/to/external_lib/headers -o prog_wih_lib prog_with_lib.cc -L/path/to/external_lib/libfile -lexternal_lib -lmy_lib 

이 또한 내가 명령 줄의 끝에있는 라이브러리를 넣어 있습니다 :

+3

"두 번째"컴파일의 정확한 오류를 알려 주실 수 있습니까? 나는 USE_EXTERN_LIB가 정의 된 두 번째 수단을 가정 할 것이다. – David

+0

my_lib.c에서 "#include"my_lib.h "? – hmjd

+0

죄송합니다. 처음 컴파일 한 프로그램이 아닙니다 – marmottus

답변

0

당신은 두 번째 명령 줄에서 빌드 할 때 명령 줄에 외부 라이브러리를 추가해야합니다. 더 이상 필요하지는 않지만 링커가 명령 행에서 입력 된 순서대로 입력 파일을 검사했기 때문에 라이브러리가 오브젝트 파일보다 먼저 명령 행에 있으면 링커가 기호를 찾을 수 없다는 오류가 발생했습니다.

5

라이브러리에서 링크 만 사용하면 링커가 사용되지 않는 코드를 제거하는 것에 대해 걱정할 수 있습니다. 그게 그 직업입니다.

당신이하려는 것은 아무 의미가 없습니다. 동적 라이브러리에서는 아무 의미가 없습니다. 라이브러리를 컴파일 할 때만 효과를 정의 할 수 있습니다. 두 번째 줄에서는 이미 컴파일 된 라이브러리를 실행 파일에 링크 만하면됩니다. 하지만 실제로 정적 라이브러리의 전체 점은 링커에서 볼 수 있으므로 사용되지 않은 코드를 제거 할 수 있습니다. 그렇다면 왜 USE_EXTERN_LIB을 정의해야합니까?

관련 문제