이 글에서는 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
$ gcc helloworld.cpp -lstdc++ -o helloworld
대부분의 시스템에서는 GCC를 설치하면 c++라는 프로그램이 함께 설치됩니다. 설치되면 다음 예와 같이 g++와 동일하며 사용법도 동일합니다.
$ c++ helloworld.cpp -o helloworld
g++에 두 개 이상의 소스 파일이 지정된 경우 command 를 실행하면 모두 컴파일되어 단일 실행 파일로 링크됩니다. 아래는 talk.h라는 헤더 파일입니다. 여기에는 함수 하나만 포함된 클래스의 정의가 포함되어 있습니다.
/* speak.h */ #include <iostream> class Speak { public: void sayHello(const char *); };
/* speak.cpp */ #include "speak.h" void Speak::sayHello(const char *str) { std::cout << "Hello " << str << "\n"; }
/* 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
-c 옵션은 컴파일러에게 소스 코드를 컴파일하지만 링크를 수행하지 않도록 지시하는 데 사용되며, 출력 결과는 객체 파일입니다. 기본 파일 이름은 접미사가 .o로 변경된 점을 제외하면 소스 파일 이름과 동일합니다. 예를 들어 다음 명령은 소스 파일 hellospeak.cpp를 컴파일하고 개체 파일 hellospeak.o를 생성합니다.
$ g++ -c hellospeak.cpp
$ g++ -c hellospeak.cpp $ g++ -c speak.cpp $ g++ hellospeak.o speak.o -o hellospeak
$ g++ -c hellospeak.cpp -o hspk1.o $ g++ -c speak.cpp -o hspk2.o $ g++ hspk1.o hspk2.o -o hellospeak
Option -E는 g++에서 소스 코드를 사용하도록 합니다. 작업은 컴파일 전처리기가 처리된 후에 수행됩니다. 다음 명령은 소스 코드 파일 helloworld.cpp를 전처리하고 결과를 표준 출력에 표시합니다.
$ g++ -E helloworld.cpp
전처리된 파일의 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++를 사용하여 C++를 컴파일하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!