Linux에서 프로세스 빌드 및 연결

Linux에서 프로세스 빌드 및 연결

빌드와 컴파일의 차이점을 알 수 없습니다. 그들은 동일합니까? 링크는 정확히 어떻게 작동하나요? .so 파일과 .o 파일에는 정확히 무엇이 포함되어 있으며 어떻게 사용해야 합니까? 나는 매일 이 파일들을 보지만, 실제로 그 파일들이 무엇을 담고 있는지는 모릅니다. 이러한 프로세스를 명확하게 설명하기 위해 튜토리얼을 제안할 수 있는 사람이 있나요?

답변1

"빌드"라는 용어는 일반적으로 소스 코드 파일 및 기타 리소스 집합으로 시작하여 실행 파일 집합, 공유 라이브러리 및 기타 리소스로 끝나는 전체 프로세스를 나타내는 데 사용됩니다. 여기에는 특수 전처리기( 예: Qt 코드), 코드 생성기( / 또는 예), 컴파일, 링크 및 사후 처리 단계(예: 빌드 또는 배포 파일)
와 같은 여러 단계가 포함될 수 있습니다 .mocflexyaccbisontar.gzrpm

C 및 C++(및 관련 언어)의 경우 컴파일은 .c소스 파일(예: C 코드 파일)을 개체 파일( .o)로 변환하는 것입니다. 이러한 개체 파일에는 해당 소스 코드에 대해 컴파일러가 생성한 기계어 코드가 포함되어 있지만 최종 제품은 아닙니다. 특히 외부 함수(및 데이터) 참조는 확인되지 않습니다. 이런 의미에서 그들은 "불완전"합니다.
개체 파일은 때때로 함께 그룹화되어 .a정적 라이브러리라고도 알려진 아카이브(파일)를 형성합니다. 이는 그것들을 함께 그룹화하는 편리한 방법일 뿐입니다.

링크는 (보통 여러 개) 객체 파일( .o또는 .a)과 공유 라이브러리를 취하고, 객체 파일을 결합하고, (주로) 객체 파일 자체와 공유 라이브러리 간의 참조를 확인하고, 실제로 사용할 수 있는 실행 파일 또는 공유 라이브러리를 생성합니다( .so). 다른 프로그램이나 공유 라이브러리에서 사용할 수 있습니다.

공유 라이브러리는 다른 실행 파일에서 직접 사용할 수 있는 코드/함수의 저장소입니다. 공유 라이브러리에 대한 동적 링크와 개체 또는 아카이브 파일의 직접(정적) 링크 간의 주요 차이점은 공유 라이브러리를 사용하는 실행 파일을 다시 빌드하지 않고도 업데이트할 수 있다는 것입니다(이에 대한 많은 제한 사항이 있음).
예를 들어, 어느 시점에서 OpenSSL 공유 라이브러리에서 버그가 발견되면 해당 코드에서 수정이 이루어질 수 있으며 업데이트된 공유 라이브러리가 구축 및 릴리스될 수 있습니다. 이 공유 라이브러리에 동적으로 링크된 프로그램은 오류를 수정하기 위해 다시 빌드할 필요가 없습니다. 공유 라이브러리를 업데이트하면 모든 사용자가 자동으로 수정됩니다.
대신 개체 파일과 링크된 경우(또는 일반적으로 정적으로 링크된 경우) 다시 빌드해야 합니다(또는 최소한다시 연결) 수정사항을 얻으려면

실제 예: 명령줄 기록/편집 지원 기능이 있는 멋진 명령줄 계산기인 C로 프로그램을 작성한다고 가정해 보겠습니다. 계산기 코드를 작성하지만 readline입력 처리를 위해 라이브러리를 사용하게 됩니다.
코드를 수학 함수(해당 함수를 에 넣음 mathfuncs.c)와 입력/출력을 처리하는 "기본" 계산기 코드(에 넣음 main.c)의 두 부분으로 나눌 수 있습니다.

당신의세워포함하다:

  • Compile mathfuncs.c( "컴파일 전용"을 gcc -o mathfuncs.o -c mathfuncs.c나타냄 ) 에는 이제 컴파일된 수학 함수가 포함되어 있지만 "실행 가능"하지는 않습니다. 함수 코드의 저장소일 뿐입니다.-c
    mathfuncs.o

  • 프런트엔드( gcc -o main.o -c main.c)를 컴파일하는 것도
    main.o단지 함수 모음일 뿐 실행 가능하지 않습니다.

  • 계산기 실행 파일을 다음과 연결하십시오 readline.

    gcc -o supercalc main.o mathfuncs.o -lreadline
    #      ^ executable                    ^ dynamic link with libreadline.so
    #                  ^         ^ two .o files statically linked in
    

    이제 라이브러리 supercalc에 따라 실행할 수 있는 실제 실행 파일( )이 생겼습니다 .readline

  • rpm모든 실행 파일과 공유 라이브러리(및 헤더 파일)가 포함된 패키지를 빌드합니다 . (이러한 .o파일은 최종 제품이 아닌 임시 빌드 제품이며 일반적으로 배송되지 않습니다.)

이렇게 하면 에서 버그가 발견된 경우 readline수정 사항을 얻기 위해 실행 파일을 다시 빌드(및 다시 게시)할 필요가 없습니다 libreadline.so. 업데이트만 하면 됩니다. 그러나 여기서 버그를 발견하면 mathfuncs.c다시 컴파일하고 다시 링크해야 합니다 supercalc(그리고 새 버전을 릴리스해야 합니다).

관련 정보