在linux下如何编译C++程序

简介: 一、GCC(GNU Compiler Collection)是linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活。它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada          g++是GCC中的一个工具,专门来编译C++语言的。

一、GCC(GNU Compiler Collection)是linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活。它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada

         g++是GCC中的一个工具,专门来编译C++语言的。

         GCC的参数有:( 也是分步实现)

                                  -E  让GCC在预处理结束后停止编译  g++ -E hello.cpp  -o  hello.i

                                   -c  将hello.i编译成目标代码 g++  -c  hello.i  -o  hello.o

                                   将目标文件连接成可执行文件   g++ hell.o   -o   hello

           可以一步实现   g++  hello.cpp  -o  hello

 

二、假如有两个以上源文件应该一下编译。

         一步就实现      g++   foo1.cpp   foo2.cpp   -o   foo

        也可以分步实现   g++   -c   foo1.cpp  -o   foo1.o

                                       g++   -c    foo2.cpp  -o   foo2.o

                                       g++   foo1.o  foo2.o    -o    foo

三、GCC一些常用选项

         1、产生警告信息的选项大多数以-W开头  其中有-Wall

              g++  -Wall  hello.cpp   -o   hello

         2、将所有的警告当成错误的选项-Werror

               g++ -Werror  hello.cpp  -o  hello

          3、寻找头文件选项 -I    (linux默认路径:头文件在/usr/include/下),不在这个路径下就要用-I指定。

              gcc  foo.cpp  -I/home/include   -o  foo

          4、 库依赖选项     -L      (linux默认路径:库文件在/usr/lib/下),不在这个路径下就要用-L指定。

                g++  foo.cpp  -L/home/lib  -lfoo  -o   foo

               库就是将源文件编译之后生成的目标文件的集合。

               库命名以lib开头。

                库有静态库(通常以.a结尾)和动态库(通常以.so结尾)

                默认情况下,g++以动态库形式连接。如果要静态库连接则要用-static指定(g++ foo.cpp  -L/home/lib  -static  -lfoo  -o  foo)

          5、优化选项  -On  (n取0到3之间)

 

四、介绍一些GNU 二进制链工具

          1、ar命令(也称为工具)   可以用来编译成静态库

              ar  [-] {操作选项} {任选项} [成员名] [count] archive files....

              ar r v  libtest.a  hello.o  hello1.o  生成一个库名为test,该库中存放了hello.o和hello1.o这两个模块。

               操作项:d (删除)、  m(移动)、p(标准输出)、q(快速追加)、r(在库中插入模块)、t(显示库的模块清单)、x(从库中提取一个成员)。

              任选项:a(成员后面添加一个新文件)、b(成员前面添加一个新文件)、c(创建一个库)、f(截短指定名字)、v(显示执行操作选项的附加信息)。

          2、编译成动态库

               分步完成: gcc  -fPIC  -c  func.cpp  -o  func.o

                                     gcc -shared  -o  libfunc.so  func.o

               一步就完成:gcc -fPIC  -shared -o libfunc.so  func.cpp

目录
相关文章
|
29天前
|
安全 编译器 C++
C++一分钟之-编译时计算:constexpr与模板元编程
【6月更文挑战第28天】在C++中,`constexpr`和模板元编程用于编译时计算,提升性能和类型安全。`constexpr`指示编译器在编译时计算函数或对象,而模板元编程通过模板生成类型依赖代码。常见问题包括误解constexpr函数限制和模板递归深度。解决策略包括理解规则、编写清晰代码、测试验证和适度使用。通过实战示例展示了如何使用`constexpr`计算阶乘和模板元编程计算平方。
41 13
|
9天前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
19 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
1天前
|
Linux C# iOS开发
如何用 WinDbg 调试Linux上的 .NET程序
【7月更文挑战第13天】 1. `dotnet-dump`: Collects process dumps with `dotnet-dump collect -p <process_id>`. 2. `lldb`: Debugs Mono runtime apps on macOS/Linux. 3. **Visual Studio Code**: Remotely debugs .NET via the C# extension. 4. **JetBrains Rider**: Supports remote debugging of .NET on Linux.
|
22天前
|
安全 小程序 Linux
Linux中信号是什么?Ctrl + c后到底为什么会中断程序?
信号在进程的学习中是一个非常好用的存在,它是软件层次上对中断机制的一种模拟,是异步通信方式,同时也可以用来检测用户空间到底发生了什么情况,然后系统知道后就可以做出相应的对策。
|
24天前
|
C++ 开发者
C++一分钟之-编译时计算:constexpr与模板元编程
【7月更文挑战第2天】C++的`constexpr`和模板元编程(TMP)实现了编译时计算,增强代码效率。`constexpr`用于声明编译时常量表达式,适用于数组大小等。模板元编程则利用模板进行复杂计算。常见问题包括编译时间过长、可读性差。避免方法包括限制TMP使用,保持代码清晰。结合两者可以解决复杂问题,但需明确各自适用场景。正确使用能提升代码性能,但需平衡复杂性和编译成本。
41 3
|
21天前
|
运维 监控 大数据
部署-Linux01,后端开发,运维开发,大数据开发,测试开发,后端软件,大数据系统,运维监控,测试程序,网页服务都要在Linux中进行部署
部署-Linux01,后端开发,运维开发,大数据开发,测试开发,后端软件,大数据系统,运维监控,测试程序,网页服务都要在Linux中进行部署
|
29天前
|
存储 算法 编译器
程序与技术分享:C++模板元编程简介
程序与技术分享:C++模板元编程简介
19 0
|
29天前
|
存储 JavaScript 前端开发
程序与技术分享:C++程序设计实验考试准备资料(2019级秋学期)
程序与技术分享:C++程序设计实验考试准备资料(2019级秋学期)
|
29天前
|
缓存 Linux 编译器
技术笔记:Linux程序包管理
技术笔记:Linux程序包管理