2011-02-07 3 views
4

libmya.so 라이브러리와 libmyb.so 라이브러리가 있습니다. libmyb.so의 함수는 libmya.so의 함수에 의존합니다. 또한 libmyb.so에 의존하는 실행 가능한 myexe가 있습니다. 이 라이브러리를 만들 때 어떤 규칙에 -l 옵션을 써야합니까?링크 할 때 라이브러리 의존성은 어떻게 작동합니까?

libmya.so: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) -o [email protected] $^ 

libmyb.so: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) $(LIBS) -o [email protected] $^ -lmya 

myexe: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) $(LIBS) -o [email protected] $^ -lmyb 

또는 2)

libmya.so: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) -o [email protected] $^ 

libmyb.so: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) $(LIBS) -o [email protected] $^ 

myexe: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) $(LIBS) -o [email protected] $^ -lmya -lmyb 

또는 다른 콤보 :

는 1)이어야한다

+1

왜 CPP를 사용하고 있습니까? 이것은 일반적으로 C 전처리 기입니다. CXX는 일반적으로 C++ 컴파일러입니다. –

+0

@Fred Nurk : 내가 여기 왔을 때와 같았습니다! 팁 고마워. – MattSmith

+0

사용중인 운영 체제는 무엇입니까? 나는 당신이 파일을 다루고 있기 때문에 유닉스를 가정하지만 명확하게 해치울 필요는 없다. – mgiuca

답변

1

나는 옵션 1 (비록 옵션 2가 작동하지만 나는 그 이후로 누구나 exe를 링크하는 사람은 모든 전이 라이브러리를 기억할 필요가있다.)를 추천 할 것이다.

그러나이 도움말은 위에서 설명한대로 so 파일을 만들기위한 것입니다. so 파일 (공유 객체)은 실행 파일과 마찬가지로 "메인"라이브러리가없는 "지능형"라이브러리입니다. so 파일은 실행 파일과 같은 다른 라이브러리에 링크 될 수 있으며 실행 파일이 so 파일에 링크되면 so 파일의 종속성을 자동으로 재귀 적으로 포함합니다.

따라서 생성 한 so 파일은 모든 종속성과 연결되어야합니다.

a 파일 (정적 라이브러리)과 같은 "벙어리"라이브러리는 다른 이야기입니다. 실행 파일에서 모든 링크를 수행해야합니다 (옵션 2).

ldd 도구를 사용하여 실행 파일과 so 파일의 종속성을 조사하여이 작동 방식을 확인하는 것이 좋습니다.

옵션 1이 더 나은 이유에 대한 실제 예를 보려면 ldd /usr/lib/libpng.so을 시도하십시오. libpng는 libz와 링크되어 있습니다. 그렇지 않다면, libpng에 링크 한 사람도 libz와 링크해야합니다. 그것은 libz가 관련되어 있다는 것을 알지 못하는 사이에 libpng와 연결할 수 있습니다.

0

라이브러리는 빌드 할 때 서로 종속되지 않습니다. 그것은 그들에게 의존하는 실행 파일 (exe 또는 dll)입니다. 라이브러리는 함수 및/또는 데이터의 모음입니다. 그들은 링크 타임에 (중요하지 않은 곳에서) exe/dll이 내용을 사용할 때 거기에 있어야합니다. 라이브러리는 링크되지 않습니다 (라이브러리를 만들 때). 라이브러리를 구성하는 객체 파일이 라이브러리에 보관됩니다.

한 라이브러리의 함수는 다른 라이브러리의 함수를 사용할 수 있지만 exe/dll의 링크 타임에만 해당 종속성이 해결됩니다. 즉 두 라이브러리가 모두 링크되어야합니다.

+1

다른 말로하면, 이것은 옵션 2가 잘 작동 할 것이라고 말하기위한 대략적인 방법입니다 ... – Mac

+0

내 대답보기. 두 옵션 모두 작동하지만 옵션 1이 훨씬 좋습니다. 아마도 라이브러리가 연결되어 있지 않고 단순히 "벙어리 (dumb)"한 객체 콜렉션 일 수도 있습니다. (적어도 Unix에서는'so' 파일이 존재하여 아마도 Unix에 관한 것입니다.) 이것은'a' 파일에는 해당되지만'so' 파일에는 해당되지 않습니다. 라이브러리는 종속성과 연결될 수 있습니다. – mgiuca

+0

@mgiuca : ypu를 읽을 수 없습니까?나는 분명히 구분하여 라이브러리와 dll을 구별한다. 귀하의 정보 dlls에 대한 실행 코드가 있기 때문에 연결되어 있어야합니다. 라이브러리는 단순히 함수와 코드를 포함하는 객체 파일의 모음 일뿐입니다. –

관련 문제