![Linux에서 어떤 라이브러리가 컴파일되었는지 확인](https://linux55.com/image/151426/Linux%EC%97%90%EC%84%9C%20%EC%96%B4%EB%96%A4%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EA%B0%80%20%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%90%98%EC%97%88%EB%8A%94%EC%A7%80%20%ED%99%95%EC%9D%B8.png)
gcc
Gnu/Linux를 실행하는 임베디드 arm으로 C 파일을 컴파일하고 싶습니다 .
어떤 함수/헤더 파일을 정적으로 컴파일해야 하는지, 어떤 함수/헤더 파일을 동적으로 컴파일해야 하는지 어떻게 알 수 있나요? (모든 헤더 파일을 정적으로 컴파일하고 싶지 않습니다)
사용할 수 있는 명령이 있나요?
예를 들어 , stdio.h
를 사용하기 위해 포함시켰는데 printf
, 정적으로 컴파일해야 하는지 알 수 있는 방법이 있나요?
답변1
대상 시스템에서 사용할 수 있는 동적 라이브러리와 그렇지 않은 동적 라이브러리를 알아야 합니다.
예를 들어 내 시스템에서는 stdio.h
이 라이브러리가 패키지의 포함 파일 중 하나 libc6-dev
(Debian 패키지 명명 규칙)이고 해당 동적 라이브러리 libc.so.6
는 입니다 libc-2.24.so
. 이는 거의 모든 프로그램의 기본 빌딩 블록이므로 ARM용입니다. system 즉, 이 라이브러리(또는 그와 동등한 것 중 일부)를 동적 라이브러리로 사용하지 않는 것은 매우 드문 일입니다. 일반적으로 사용되고 상당히 크기 때문에 동적 라이브러리로 사용하는 것이 완벽합니다.
(또한 GNU C 라이브러리 자체는 구성 가능한 이름 확인 기능과 같은 작업을 위해 동적 연결을 사용합니다. /etc/nsswitch.conf
이는 C 라이브러리에 libnss_*.so
런타임에 로드할 라이브러리를 알려주므로 GNU C 라이브러리를 프로그램에 완전히 정적으로 연결하는 것은 매우 까다로울 수 있습니다.)
특정 라이브러리에 대한 특정 파일이 임베디드 ARM 시스템에 설치되어 있지 않은데 lib*.so
프로그램에서 해당 라이브러리를 계속 사용하려면 라이브러리를 정적으로 링크해야 합니다. 크로스 컴파일의 경우 이 작업을 수행하려면 해당하는 항목이 있어야 합니다.ARM 버전lib*.a
도서관의 파일프로그램을 크로스 컴파일하는 시스템에서.
라이브러리의 헤더 파일( *.h
)은 라이브러리가 컴파일될 수 있는 모든 아키텍처에서 동일할 가능성이 높지만 *.so
및 *.a
파일은 그렇지 않습니다. *.so
및 *.a
파일 모두 실행 가능한 코드를 포함하고 있기 때문에 각 프로세서 아키텍처에 따라 다릅니다. 따라서 x86_64 시스템에서 ARM용으로 크로스 컴파일하는 경우 사용 가능한 특정 라이브러리 파일의 x86_64 버전에서는 정적으로 컴파일된 라이브러리를 사용하여 ARM 프로그램을 크로스 컴파일하는 것을 허용하지 않습니다. 해당 라이브러리에는 ARM이 lib*.a
필요합니다 .lib*.a