2011-01-18 8 views
0

이미 컴파일 된 다른 라이브러리를 사용하는 라이브러리를 빌드 할 수 있습니까?연결 문제 - 라이브러리를 만들고 다른 아카이브를 사용하려고 시도했습니다.

정상적으로 실행 파일을 만드는 데 사용되는 일부 make 파일이 있습니다. 실행 파일을 만들 때, 나는 원래 라이브러리를 포함하기 위해 -L ../include/lib1.a를 사용한다.

지금, 나는 도서관에 결코 만들어진 실행 파일에서 클래스를 호출하는 별도의 프로그램을 구축하고, 단지 LIB2 참조를 포함

${CPP} -c ${INC} ${CFLAGS} MyFile.cpp ${OBJ} ${LIB2} -lm 

같은 링크가 실행 파일에 컴파일 to lib1.a

이제 MyFile.cpp 클래스에 직접 액세스하고 자체 라이브러리 lib2.a에 빌드하고 새 프로그램에서 호출하려고하면 오류가 발생합니다. 참조하는 클래스가 누락되었습니다. 이것은 새 프로그램을 빌드 할 때 lib1.a와 lib2.a 모두에 연결한다는 사실에도 불구하고 있습니다.

+0

'make -n'을 표시 할 수 있습니까? 변수 대체를 추측하는 것은 까다 롭습니다. – chrisaycock

답변

0

네, 그렇게 할 수 있어야합니다. 당신이 얻고있는 정확한 오류를 보는 것이 도움이 될 것입니다.

소스를 라이브러리로 컴파일하고 명령 줄에서 사용하는 라이브러리를 제공하는 경우 컴파일러는 다른 라이브러리 을 새 라이브러리에 넣어야합니다. 그런 일이 발생하면 누군가가 여러분의 라이브러리와 다른 프로그램에 대해 프로그램을 만들려고 시도 할 때 "이중으로 정의 된 심볼"오류가 발생합니다.

+0

두 개 이상의 라이브러리가 심볼을 정의하는 경우 다른 심볼이 다른 심볼로 뽑히지 않는 한 그 중 하나만 사용됩니다. 사용되는 라이브러리는 지정된 순서에 따라 첫 번째 라이브러리의 라이브러리입니다. 위의 기술은 새 라이브러리가 먼저 지정된 경우 원본 라이브러리와 함께 오류를 생성하지 않습니다. –

1

가해야 :

-L../include/lib1.a 

가되지 :

-L../include -llib1 

즉, -L은 라이브러리 검색 경로를 나타내고 -l은 아카이브 이름을 나타 냅니까?

+0

좋은 지적. 또한 바이너리 라이브러리 파일을 "include"디렉토리에 넣는 것이 다소 이상하지 않습니까? –

+0

나는 그것을 조사 할 것이다 - 나는 꽤 어느 쪽이든 작동 함을 확신한다. – Derek

0

lib2.a를 빌드하면 lib1.a에 포함 된 오브젝트 파일이 포함되지 않습니다.

최종 실행 파일은 두 파일 모두에 링크되어 있어야합니다.

관련 문제