>  기사  >  운영 및 유지보수  >  Linux에서 g++를 사용하여 C++를 컴파일하는 방법

Linux에서 g++를 사용하여 C++를 컴파일하는 방법

小云云
小云云원래의
2018-03-26 09:32:142008검색

이 글에서는 Linux 환경에서 g++로 C++를 컴파일하는 방법과 관련 예제 코드 공유를 주로 공유합니다. 모두에게 도움이 되기를 바랍니다.

단일 소스 파일이 실행 가능한 프로그램을 생성합니다

다음은 helloworld.cpp 파일에 저장된 간단한 C++ 프로그램의 코드입니다.


/* helloworld.cpp */
#include <iostream>
int main(int argc,char *argv[])
{
  std::cout << "hello, world" << std::endl;
  return(0);
}

프로그램은 헤더 파일 iostream에 정의된 cout을 사용하여 간단한 문자열이 표준 출력에 기록됩니다. 이 코드는 다음 명령을 사용하여 실행 파일로 컴파일할 수 있습니다.


$ g++ helloworld.cpp

컴파일러 g++는 명령줄에 지정된 파일의 접미사 이름을 확인하여 C++ 소스 코드 파일을 식별할 수 있습니다. 컴파일러의 기본 동작: 소스 코드 파일을 컴파일하여 객체 파일(객체 파일)을 생성하고, 객체 파일과 libstdc++ 라이브러리의 함수를 연결하여 실행 가능한 프로그램을 얻습니다. 그런 다음 개체 파일을 삭제합니다. 실행 프로그램의 파일 이름이 명령줄에 지정되지 않으므로 컴파일러는 기본 a.out을 사용합니다. 프로그램은 다음과 같이 실행할 수 있습니다:


$ ./a.out
hello, world

보다 일반적인 접근 방식은 -o 옵션을 통해 실행 가능한 프로그램의 파일 이름을 지정하는 것입니다. 다음 명령은 helloworld라는 실행 파일을 생성합니다.

$ g++ helloworld.cpp -o helloworld

이를 실행하려면 명령줄에 프로그램 이름을 입력하세요.

$ ./helloworld
hello, world

프로그램 g++는 gcc의 기본 언어를 다음으로 설정하는 특수 프로그램입니다. C++ 버전에서는 링크 시 C 표준 라이브러리 대신 C++ 표준 라이브러리를 자동으로 사용합니다. 소스 코드의 명명 규칙을 따르고 해당 라이브러리의 이름을 지정하면 다음 예와 같이 gcc를 사용하여 C++ 프로그램을 컴파일하고 링크하는 것이 가능합니다.

$ gcc helloworld.cpp -lstdc++ -o helloworld

option -l (ell) 접두사 lib와 접미사 .a를 추가하면 그 뒤에 오는 이름이 libstdc++.a 라이브러리의 이름으로 변환됩니다. 그런 다음 표준 라이브러리 경로에서 라이브러리를 찾습니다. gcc의 컴파일 과정과 출력 파일은 g++의 것과 완전히 동일합니다.

대부분의 시스템에서는 GCC를 설치하면 c++라는 프로그램이 함께 설치됩니다. 설치되면 다음 예와 같이 g++와 동일하며 사용법도 동일합니다.

$ c++ helloworld.cpp -o helloworld

여러 소스 파일이 실행 파일을 생성합니다.


g++에 두 개 이상의 소스 파일이 지정된 경우 command 를 실행하면 모두 컴파일되어 단일 실행 파일로 링크됩니다. 아래는 talk.h라는 헤더 파일입니다. 여기에는 함수 하나만 포함된 클래스의 정의가 포함되어 있습니다.

/* speak.h */
#include <iostream>
class Speak
{
  public:
    void sayHello(const char *);
};

아래 목록은 talk.cpp 파일의 내용입니다. sayHello() 함수가 포함된 함수 본문 :

/* speak.cpp */
#include "speak.h"
void Speak::sayHello(const char *str)
{
  std::cout << "Hello " << str << "\n";
}

hellospeak.cpp 파일은 Speak 클래스를 사용하는 프로그램입니다:

/* hellospeak.cpp */
#include "speak.h"
int main(int argc,char *argv[])
{
  Speak speak;
  speak.sayHello("world");
  return(0);
}

다음 명령은 위의 두 소스 코드 파일을 컴파일하고 단일 실행 프로그램으로 링크합니다.

$ g++ hellospeak.cpp speak.cpp -o hellospeak

추신: "speak.h" 파일이 명령에 언급되지 않은 이유에 대해 이야기해 보겠습니다. (이유는 "#include "speak.h""가 "speak.cpp"에 포함되어 있다는 의미입니다. 시스템 헤더 파일을 검색하기 전에 디렉터리에 있는 경우 "speak.h" 파일이 현재 디렉터리에서 검색됩니다. 그리고 "speak.h"는 이 디렉터리에 있으므로 명령에 지정할 필요가 없습니다.

소스 파일은 객체 파일을 생성합니다


-c 옵션은 컴파일러에게 소스 코드를 컴파일하지만 링크를 수행하지 않도록 지시하는 데 사용되며, 출력 결과는 객체 파일입니다. 기본 파일 이름은 접미사가 .o로 변경된 점을 제외하면 소스 파일 이름과 동일합니다. 예를 들어 다음 명령은 소스 파일 hellospeak.cpp를 컴파일하고 개체 파일 hellospeak.o를 생성합니다.

$ g++ -c hellospeak.cpp

Command g++는 .o 파일도 인식하여 링커에 입력 파일로 전달할 수 있습니다. 다음 명령은 소스 파일을 개체 파일로 컴파일하고 이를 단일 실행 프로그램으로 연결합니다.

$ g++ -c hellospeak.cpp 
$ g++ -c speak.cpp 
$ g++ hellospeak.o speak.o -o hellospeak

-o 옵션은 실행 파일 이름을 지정하는 것 이상의 용도로 사용할 수 있습니다. 또한 컴파일러가 출력하는 다른 파일의 이름을 지정하는 데에도 사용됩니다. 예: 다음 명령은 중간 개체 파일의 이름이 다르다는 점을 제외하고 위와 정확히 동일한 실행 파일을 생성합니다.

$ g++ -c hellospeak.cpp -o hspk1.o 
$ g++ -c speak.cpp -o hspk2.o 
$ g++ hspk1.o hspk2.o -o hellospeak

Compile preprocessing


Option -E는 g++에서 소스 코드를 사용하도록 합니다. 작업은 컴파일 전처리기가 처리된 후에 수행됩니다. 다음 명령은 소스 코드 파일 helloworld.cpp를 전처리하고 결과를 표준 출력에 표시합니다.

$ g++ -E helloworld.cpp

이 기사 앞부분에 나열된 helloworld.cpp의 소스 코드에는 6줄만 있고 프로그램은 1줄만 표시합니다. of text 다른 작업은 수행하지 않지만 전처리된 버전은 1200줄이 넘습니다. 이는 주로 헤더 파일 iostream이 포함되어 있고 다른 헤더 파일도 포함되어 있기 때문입니다. 또한 입력 및 출력을 처리하는 여러 클래스에 대한 정의가 있습니다.

전처리된 파일의 GCC 접미사는 .ii이며 -o 옵션으로 생성할 수 있습니다. 예:

$ gcc -E helloworld.cpp -o helloworld.ii

어셈블리 코드 생성


옵션 -S는 컴파일러에게 다음을 컴파일하도록 지시합니다. 어셈블리 언어로 프로그래밍하고 어셈블리 언어 코드를 출력한 다음 종료합니다. 다음 명령은 C++ 소스 코드 파일에서 어셈블리 언어 파일 helloworld.s를 생성합니다.


$ g++ -S helloworld.cpp

生成的汇编语言依赖于编译器的目标平台。

创建静态库

静态库是编译器生成的一系列对象文件的集合。链接一个程序时用库中的对象文件还是目录中的对象文件都是一样的。库中的成员包括普通函数,类定义,类的对象实例等等。静态库的另一个名字叫归档文件(archive),管理这种归档文件的工具叫 ar 。

在下面的例子中,我们先创建两个对象模块,然后用其生成静态库。

头文件 say.h 包含函数 sayHello() 的原型和类 Say 的定义:


/* say.h */
#include <iostream>
void sayhello(void);
class Say {
  private:
    char *string;
  public:
    Say(char *str)
    {
      string = str;
    }
    void sayThis(const char *str)
    {
      std::cout << str << " from a static library\n";
    }
    void sayString(void);
};

下面是文件 say.cpp 是我们要加入到静态库中的两个对象文件之一的源码。它包含 Say 类中 sayString() 函数的定义体;类 Say 的一个实例 librarysay 的声明也包含在内:


/* say.cpp */
#include "say.h"
void Say::sayString()
{
  std::cout << string << "\n";
}
 
Say librarysay("Library instance of Say");

源码文件 sayhello.cpp 是我们要加入到静态库中的第二个对象文件的源码。它包含函数 sayhello() 的定义:


/* sayhello.cpp */
#include "say.h"
void sayhello()
{
  std::cout << "hello from a static library\n";
}

下面的命令序列将源码文件编译成对象文件,命令 ar 将其存进库中:


$ g++ -c sayhello.cpp
$ g++ -c say.cpp
$ ar -r libsay.a sayhello.o say.o

程序 ar 配合参数 -r 创建一个新库 libsay.a 并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。

下面是主程序 saymain.cpp,它调用库 libsay.a 中的代码:


/* saymain.cpp */
#include "say.h"
int main(int argc,char *argv[])
{
  extern Say librarysay;
  Say localsay = Say("Local instance of Say");
  sayhello();
  librarysay.sayThis("howdy");
  librarysay.sayString();
  localsay.sayString();
  return(0);
}

该程序可以下面的命令来编译和链接:


$ g++ saymain.cpp libsay.a -o saymain

程序运行时,产生以下输出:


hello from a static library
howdy from a static library
Library instance of Say
Local instance of Say

ps:如果一个文件夹下有多个cpp文件需要编译的话,除了采用makefile的方式之外,还可以使用“g++ *.cpp -o hello",“hello为编译生成的可执行文件的名字”,编译时要确保cpp文件和他们各自所引用的头文件在同一个目录下。

相关推荐:

在Linux环境下g++编译GDAL动态库的操作方法

Linux下g++编译以及使用静态库和动态库的方法详解

Linux下如何实现C++操作Mysql数据库的详细介绍


위 내용은 Linux에서 g++를 사용하여 C++를 컴파일하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.