2016-11-29 1 views
1

간단하게 유지하려면 A.lib, libB.so (A.lib 사용) 및 C.exe (libB를 사용)를 가정합니다. 그래서). 참고 : 이것은 Windows가 아닌 Linux입니다. 나는 이진 타입/목적을 전달하기 위해 .exe를 사용하고 있습니다.g ++에서 .so와 연결하면 정의되지 않은 참조가됩니다.

그냥 간단한 테스트 프로그램이므로 명령 프롬프트에서 C.exe를 컴파일하고 연결하려고합니다. 내가 사용하고있는 라인입니다 :

g++ -I../include C.cpp -o C.exe -L../lib -lB 

결과는 A.lib에있는 것들에 대한 많은 정의되지 않은 참조입니다. libB.so에서 내 보낸 모든 것을 참조하는 오류는 없습니다.

내가 그 같은 디렉토리에 libB.so를 복사하고이 명령을 사용하는 경우 :

g++ -I../include C.cpp -o C.exe -lB 

결과는 C.exe가 내장되어 오류없이 실행할 수있다.

일단 libB.so가 빌드되면 빌드하는 데 사용한 libs가 필요 없습니다. 그럼에도 불구하고, 나는 마지막 시도로 무언가를 시도 할 것이라고 생각했습니다. A.lib를 libB.so와 동일한 lib 디렉토리에 복사하고 원래 빌드 명령을 다시 시도했습니다. 그 결과도 마찬가지였다.

모든 의견을 환영합니다.

+0

어떻게'libB.so'를 링크 시켰습니까? 'A.lib'와 명시 적으로 링크를 했습니까? –

+0

'-L'과 함께'-R' 옵션을 사용하십시오. 더 자세한 정보는'ld'의 man 페이지를보십시오. –

+0

그건 그렇고,'A' 라이브러리는 정적 라이브러리입니까, 아니면 동적 라이브러리입니까? –

답변

0

SamVershavchik이 대답의 길에 나를 둡니다. 이 명령을 먼저 시도했습니다 :

g++ -I../include C.cpp -o C.exe -Wl,-R,../lib -lB 

결과는 깨끗한 빌드 였지만 C.exe를 실행했을 때 기호가 누락되었다는 오류가 발생했습니다.

g++ -I../include C.cpp -o C.exe -Wl,-R,--just-symbols=../lib/libB.so -lB 

깨끗한 빌드하고 오류없이 C.exe을 실행할 수있는 능력 결과 :

나는 다음 명령을 수정했습니다.

관련 문제