2012-03-21 1 views
2

컴파일 할 때 -L (mylib.a)를 사용하여 리눅스의 다른 라이브러리에 정적으로 링크하는 프로그램이 있습니다 (eclipse cdt 사용).C++에서의 정적 연결 사용 linux : 라이브러리를 바꿀 때마다 모든 것을 다시 컴파일해야합니까?

링크가 정적이라는 사실은 나의 바이너리에 라이브러리가 삽입되었음을 의미합니다. mylib를 변경하면 바이너리를 다시 컴파일해야합니까? 나는 그렇게 생각하지만 시간이 지나면 큰 오버 헤드이므로 확실히하고 싶었다. mylib가 변경된 경우 eclipse는 다시 컴파일해야한다는 것을 인식하지만 mylib에 링크되어 있더라도 바이너리 자체를 다시 컴파일해야한다는 것을 인식하지 못합니다.

답변

1

예. 새 라이브러리 및 업데이트 된 라이브러리에 링크되는 바이너리를 생성하려면 수정 된 라이브러리로 코드를 다시 빌드해야합니다. 컴파일러는 각 번역 단위 컴파일이 단계에서
:
편집 :

프로젝트의 건물은 두 개의 이정표 단계에 나누어 질 수있다. 유효한 구문 등을 확인하고 객체 파일을 생성합니다.이 객체 파일에는 소스 코드의 어셈블리 코드 출력이 포함됩니다.

링크하기 : 함께 링커 링크 오브젝트 파일 및 라이브러리는 실행 파일을 생성하기 위해이 단계에서
.

정적 라이브러리를 사용하는 응용 프로그램 또는 프로젝트는 일반적으로 응용 프로그램이 사용하는 API 목록 및 기타 구성을 포함하는 라이브러리 인터페이스로 호출되는 헤더 파일을 포함합니다. 응용 프로그램은 라이브러리 파일과 연결해야합니다.

인터페이스가 그대로, 즉 응용 프로그램에 포함 된 라이브러리 헤더 파일이 변경되지 않은 경우 컴파일이 필요하지 않지만 업데이트 된 라이브러리에 연결하면됩니다.

그러나, 나는 Eclipse IDE를 통해 업데이트 된 라이브러리를 다시 링크하는 방법이 있다고 생각하지 않으므로 본질적으로 필요한 작업을 다시해야합니다.
예 :
프로젝트를 다시 컴파일하고 새 라이브러리를 다시 연결하거나
프로젝트에 새 라이브러리를 다시 연결하십시오.

+0

링크는 컴파일의 일부가 아니지만 일반적으로 컴파일러 명령으로도 수행됩니다. – leftaroundabout

+0

@leftaroundabout : Compilation & Linking은 두 개의 분리 된 별개의 프로세스라는 것을 알고 있습니다. 그리고 확실하게 둘 다 명령 줄에서 개별적으로 수행 할 수 있지만 나는 OP가 사용하는 이클립스에서 개별적으로 수행 할 수 있다고 생각하지 않는다. –

+0

"다시 작성"이 "다시 컴파일"보다 덜 논란 일 수 있습니다. – juanchopanza

3

라이브러리의 인터페이스 (예 : 헤더)를 변경하지 않은 경우 리 링크만으로 충분합니다.

+0

. 이클립스에서만 다시 링크를 수행하는 방법을 알고 있습니까? – dan12345