programing

컴파일 시간 동안 공유 라이브러리가 필요한 이유는 무엇입니까?

muds 2023. 9. 14. 00:02
반응형

컴파일 시간 동안 공유 라이브러리가 필요한 이유는 무엇입니까?

실행 파일의 컴파일 시간 동안 공유 라이브러리의 존재가 필요한 이유는 무엇입니까?공유 라이브러리는 실행 파일에 포함되지 않고 실행 중에 로드되기 때문에 컴파일 시간에는 필요하지 않습니다.아니면 제가 뭔가를 놓치고 있는 건가요?

#include<stdio.h>
int addNumbers(int, int); //prototype should be enough, no? 
int main(int argc, char* argv[]){
  int sum = addNumbers(1,2);
  printf("sum is %d\n", sum);
  return 0;
}

저는.libfoo.so지금의 나의 dir에서 나는 그것의 이름을 로 바꿨습니다.libfar.so컴파일할 때 공유 lib이 필요하거나 컴파일되지 않는 경우를 찾습니다.

gcc -o main main.c -L. -lfoo주는main.c:(.text+0x28): undefiend reference to 'addNumber'

공유도서관 이름만 있으면 충분할 것 같습니다.공유 라이브러리 자체는 LD_LIBRARY_PATH에 있으며 런타임에 동적으로 로드되므로 필요하지 않습니다.공유 lib의 이름 외에 다른 필요한 것이 있습니까?

C는 번역 단위를 별도로 컴파일한다는 개념을 가지고 있기 때문에 컴파일 에는 아무것도 필요하지 않습니다.하지만 여러 출처가 모두 정리된 이상 이제는 모든 것을 하나로 연결해야 할 때입니다.공유 라이브러리의 개념은 표준에 존재하지 않지만 이제는 일반적인 것이 되었으므로 다음은 일반 링커의 진행 방식입니다.

  • 외부 링크가 정의되거나 선언된 식별자에 대해 컴파일된 모든 모듈에서 찾습니다.
  • 라이브러리(정적 및 동적)에서 이미 사용되고 정의되지 않은 식별자를 찾습니다.그런 다음 정적 라이브러리에서 모듈을 연결하고 동적 라이브러리에서 참조를 저장합니다.하지만 적어도 유닉스 계열에서는 이미 정의되어 있거나 다른 링크된 라이브러리에서 정적 또는 동적 식별자를 찾을 수 있는지 확인하기 위해 필요한 잠재적인(정의되지 않은) 식별자에 대해 공유 라이브러리에 액세스해야 합니다.

이렇게 하면 실행 파일이 생성됩니다.그런 다음 로드 시 동적 로더는 필요한 모든 동적 모듈을 알고 실제 실행 파일과 함께 메모리에 로드하고 (이미 존재하지 않는 경우) (가상) 메모리 맵을 구축합니다.

gcc -o main main.c -L. -lfoo

이 명령어는 컴파일이라는 두 단계를 수행합니다.main.c개체 파일로 연결하고 모든 리소스를 실행 파일로 연결합니다.main. 마지막 단계인 링커에서 발생한 오류입니다.

링커는 최종 실행 가능한 기계 코드를 생성할 책임이 있습니다.기계 코드를 생성해야 하기 때문에 공유 오브젝트 라이브러리가 필요합니다. 기계 코드를 생성하고 기계 코드에서 사용되는 모든 기능을 실행해야 합니다.

언급URL : https://stackoverflow.com/questions/48770958/why-do-we-need-the-shared-library-during-compile-time

반응형