수색…


소개

C ++와 마찬가지로 C는 컴파일 작업 흐름 및 빌드 프로세스와 관련된 길고 다양한 역사를 가지고 있습니다. 오늘날 C ++에는 프로그램을 컴파일하는 데 사용되는 다양한 대중적인 빌드 시스템이 있으며 때로는 하나의 빌드 시스템에서 여러 플랫폼에 사용됩니다. 여기서 몇 가지 빌드 시스템을 검토하고 분석합니다.

비고

현재 널리 사용되고 크로스 플랫폼 인 C ++의 보편적이거나 지배적 인 빌드 시스템은 존재하지 않습니다. 그러나 주요 플랫폼 / 프로젝트에 연결된 몇 가지 주요 빌드 시스템이 존재합니다. 가장 주목할만한 것은 GNU / Linux 운영 체제의 GNU Make와 Visual C ++ / Visual Studio 프로젝트 시스템의 NMAKE입니다.

또한 일부 IDE (Integrated Development Environment)에는 기본 IDE와 함께 특수하게 사용되는 특수 빌드 시스템이 포함되어 있습니다. 특정 빌드 시스템 생성기는 이클립스 용 Eclipse 및 Microsoft Visual Studio 2012와 같은 네이티브 IDE 빌드 시스템 / 프로젝트 형식을 생성 할 수 있습니다.

CMake로 빌드 환경 생성하기

CMake 는 단일 프로젝트 정의에서 거의 모든 컴파일러 또는 IDE 용 빌드 환경을 생성합니다. 다음 예제는 크로스 플랫폼 "Hello World"C ++ 코드에 CMake 파일을 추가하는 방법을 보여줍니다.

CMake 파일의 이름은 항상 "CMakeLists.txt"이며 모든 프로젝트의 루트 디렉토리 (하위 디렉토리에도 가능)에 있어야합니다. 기본 CMakeLists.txt 파일은 다음과 같습니다.

cmake_minimum_required(VERSION 2.4)

project(HelloWorld)

add_executable(HelloWorld main.cpp)

그것은 Coliru에 살고보십시오 .

이 파일은 CMake에게 프로젝트 이름, 예상 파일 버전, main.cpp 가 필요한 "HelloWorld"라는 실행 파일을 생성하는 방법을 알려줍니다.

명령 줄에서 설치된 컴파일러 / IDE 빌드 환경을 생성하십시오.

> cmake .

다음을 사용하여 응용 프로그램을 빌드하십시오.

> cmake --build .

이렇게하면 OS 및 설치된 도구에 따라 시스템의 기본 빌드 환경이 생성됩니다. "out-of-source"빌드를 사용하여 빌드 아티팩트에서 소스 코드를 깨끗하게 유지합니다.

> mkdir build
> cd build
> cmake ..
> cmake --build .

CMake는 앞의 예제에서 플랫폼 쉘의 기본 명령을 추상화 할 수 있습니다.

> cmake -E make_directory build
> cmake -E chdir build cmake .. 
> cmake --build build 

CMake는 다수의 일반적인 빌드 툴과 IDE를위한 생성기 를 포함합니다. Visual Studio의 nmake 용 메이크 파일 생성하기 :

> cmake -G "NMake Makefiles" ..
> nmake

GNU make로 컴파일하기

소개

GNU Make (스타일 화 된 make )는 셸 명령을 실행하는 자동화에 사용되는 프로그램입니다. GNU Make는 Make 패밀리에 해당하는 하나의 특정 프로그램입니다. 리눅스 커널, Mac OS X 및 BSD에서 파생 된 것들을 포함하여 유닉스와 같은 운영 체제와 POSIX와 유사한 운영 체제에서 인기가 있습니다.

GNU Make는 유명한 GNU / Linux 운영 체제에 첨부 된 GNU 프로젝트에 첨부 된 경우 특히 주목할만한 기능입니다. GNU Make는 또한 다양한 버전의 Windows 및 Mac OS X에서 실행되는 호환 가능한 버전을 보유하고 있습니다. 또한 역사적인 중요성을 지닌 매우 안정적인 버전입니다. 이러한 이유 때문에 GNU Make는 종종 C와 C ++와 함께 가르칩니다.

기본 규칙

make로 컴파일하려면, 프로젝트 디렉토리에 Makefile을 생성하십시오. Makefile은 다음과 같이 간단 할 수 있습니다.

Makefile

# Set some variables to use in our command
# First, we set the compiler to be g++
CXX=g++

# Then, we say that we want to compile with g++'s recommended warnings and some extra ones.
CXXFLAGS=-Wall -Wextra -pedantic

# This will be the output file
EXE=app

SRCS=main.cpp

# When you call `make` at the command line, this "target" is called.
# The $(EXE) at the right says that the `all` target depends on the `$(EXE)` target.
# $(EXE) expands to be the content of the EXE variable
# Note: Because this is the first target, it becomes the default target if `make` is called without target
all: $(EXE)

# This is equivalent to saying
# app: $(SRCS)
# $(SRCS) can be separated, which means that this target would depend on each file.
# Note that this target has a "method body": the part indented by a tab (not four spaces).
# When we build this target, make will execute the command, which is:
# g++ -Wall -Wextra -pedantic -o app main.cpp
# I.E. Compile main.cpp with warnings, and output to the file ./app
$(EXE): $(SRCS)
    @$(CXX) $(CXXFLAGS) -o $@ $(SRCS)

# This target should reverse the `all` target. If you call
# make with an argument, like `make clean`, the corresponding target
# gets called.
clean:
    @rm -f $(EXE)

참고 : 들여 쓰기가 4 개의 공백이 아니라 탭으로되어 있는지 확인하십시오. 그렇지 않으면 Makefile:10: *** missing separator. Stop. 오류가 발생 Makefile:10: *** missing separator. Stop.

명령 행에서이를 실행하려면 다음을 수행하십시오.

$ cd ~/Path/to/project
$ make
$ ls
app  main.cpp  Makefile

$ ./app
Hello World!

$ make clean
$ ls
main.cpp  Makefile

증분 빌드

더 많은 파일을 갖기 시작하면 make가 더 유용 해집니다. a.cpp는 편집하지만 b.cpp는 편집하지 않으면 어떻게 됩니까? b.cpp를 재 컴파일하는 것은 더 많은 시간이 걸립니다.

다음 디렉토리 구조로 :

.
+-- src
|   +-- a.cpp
|   +-- a.hpp
|   +-- b.cpp
|   +-- b.hpp
+-- Makefile

이것은 좋은 Makefile이 될 것이다 :

Makefile

CXX=g++
CXXFLAGS=-Wall -Wextra -pedantic
EXE=app

SRCS_GLOB=src/*.cpp
SRCS=$(wildcard $(SRCS_GLOB))
OBJS=$(SRCS:.cpp=.o)

all: $(EXE)

$(EXE): $(OBJS)
    @$(CXX) -o $@ $(OBJS)

depend: .depend

.depend: $(SRCS)
    @-rm -f ./.depend
    @$(CXX) $(CXXFLAGS) -MM $^>>./.depend

clean:
    -rm -f $(EXE)
    -rm $(OBJS)
    -rm *~
    -rm .depend

include .depend

다시 탭을보세요. 이 새로운 Makefile을 사용하면 컴파일 된 시간을 최소화하면서 변경된 파일 만 다시 컴파일 할 수 있습니다.

선적 서류 비치

make에 대한 자세한 내용 은 Free Software Foundation의 공식 문서 , stackoverflow 문서dmckee의 stackoverflow에 대한 정교한 대답을 참조하십시오 .

SCons로 구축하기

당신은 구축 할 수 있습니다 크로스 플랫폼 "안녕하세요"C ++ 코드를 사용하여 SCons는 A - 파이썬 -language 소프트웨어 구성 도구를.

먼저 SConstruct 라는 파일을 만듭니다 (SCons는 기본적으로이 정확한 이름을 가진 파일을 찾습니다). 지금은 파일이 hello.cpp 에있는 디렉토리에 있어야합니다. 새 파일에 줄을 씁니다.

 Program('hello.cpp')

자, 터미널에서 scons 실행하십시오. 너는 비슷한 것을보아야한다.

$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o hello.o -c hello.cpp
g++ -o hello hello.o
scons: done building targets.

(세부 사항은 운영 체제 및 설치된 컴파일러에 따라 다름).

EnvironmentGlob 클래스는 빌드 대상을 추가로 구성하는 데 도움이됩니다. 예 : SConstruct 파일

env=Environment(CPPPATH='/usr/include/boost/',
    CPPDEFINES=[],
    LIBS=[],
    SCONS_CXX_STANDARD="c++11"
    )

env.Program('hello', Glob('src/*.cpp'))     

src 모든 cpp 파일을 사용하여 실행 가능한 hello 빌드합니다. CPPPATH/usr/include/boost 이고 C ++ 11 표준을 지정합니다.

닌자

소개

Ninja 빌드 시스템은 프로젝트 웹 사이트에서 "속도에 중점을 둔 소형 빌드 시스템"이라고 설명합니다 . Ninja는 시스템 파일 생성기를 빌드하여 파일을 생성하도록 설계되었으며 CMake 또는 Meson과 같은 상위 레벨 빌드 시스템 관리자와 달리 시스템을 빌드하는 데 낮은 수준의 접근 방식을 취합니다.

Ninja는 주로 C ++ 및 Python으로 작성되었으며 Chromium 프로젝트 용 SCons 빌드 시스템의 대안으로 만들어졌습니다.

NMAKE (Microsoft 프로그램 유지 관리 유틸리티)

소개

NMAKE는 Microsoft에서 주로 Microsoft Visual Studio 및 / 또는 Visual C ++ 명령 줄 도구와 함께 사용하도록 개발 된 명령 줄 유틸리티입니다.

NMAKE는 빌드 시스템의 Make 계열에 속하는 빌드 시스템이지만 Windows 관련 파일 경로 구문 (Unix 스타일 파일 경로와는 다른)을 지원하는 것과 같이 유닉스와 같은 Make 프로그램과 다른 특정 기능을 가지고 있습니다.

자동 도구 (GNU)

소개

Autotools는 주어진 소프트웨어 패키지를위한 GNU 빌드 시스템을 만드는 프로그램 그룹입니다. Makefile (GNU Make와 함께 사용되는)과 같은 다양한 빌드 리소스를 생성하기 위해 함께 작동하는 도구 모음입니다. 따라서 Autotools는 사실상 빌드 시스템 생성기로 간주 될 수 있습니다.

주목할만한 Autotools 프로그램에는 다음이 포함됩니다.

  • Autoconf
  • Automake ( make 와 혼동하지 말 make )

일반적으로 Autotools는 Unix 호환 스크립트와 Makefile을 생성하여 다음 명령이 대부분의 패키지를 빌드 (설치) 할 수 있도록합니다 (간단한 경우).

./configure && make && make install

따라서 Autotools는 특정 패키지 관리자, 특히 POSIX 표준을 준수하는 운영 체제에 연결된 패키지 관리자와도 관계가 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow