gcc编译链接时指定头文件和库文件搜索路径
如何指定GCC的默认头文件路径

如何指定GCC的默认头文件路径
下面是使用#include时的一些规则:
1)使用<>包含的头文件一般会先搜索-I选项后的路径(即用gcc 编译时的-I选项),之后就是标准的系统头文件路径。
2)而用""号包含的头文件会首先搜索当前的工作目录,之后的搜索路径才是和<>号包含的头文件所搜索的路径一
样的路径。
3)在unix系统中,一般标准的头文件路径为:
/usr/local/include
/usr/lib/gcc-lib/target/version/include
/usr/target/include
/usr/include
那如何指定默认的GCC头文件路径呢?
$cd ~
$vim .profile
利用系统的环境变量。
对于头文件的搜索路径:
C_INCLUDE_PATH=<your include path>
export C_INCLUDE_PATH
对于库文件的搜索路径:
LIBRARY_PATH=<your lib path>
export LIBRARY_PATH
对于链接程序ld使用的库文件搜索路径:
LD_LIBRARY_PATH=<your ldlib path> export LD_LIBRARY_PATH。
gcc 编译器命令总结

gcc 编译器命令总结1. 三种常用格式i.gcc C源文件-o 目标文件名。
ii.gcc -o 目标文件名C源文件。
iii.gcc C源文件。
(目标文件名默认为:a.out)2. gcc 支持的一些源文件的后缀.c C语言源代码文件。
.a 是由目标文件构成的档案库文件。
.C .cc 或.cxx 是C++ 源代码文件。
.h 是程序所包含的头文件。
.i 是已经预处理过的C源代码文件。
.ii 是已经预处理的C++源代码文件。
.m 是Objective-C源代码文件。
.o 是编译后的目标文件。
.s 是汇编语言源代码文件。
.S 是经过预处理的汇编语言源代码文件。
3.gcc 常用参数-c 只激活预处理,编译和汇编,也就是只把程序做成obj文件。
-S 只激活预处理和编译,就是把文件编译成汇编代码。
-E 只激活预处理,不生成文件,需要把它重定向到一个输出文件里面。
-g 在可执行文件中包含调试信息。
-v 显示gcc 版本信息。
-o file 把输出文件输出到文件中。
-I dir 在头文件的搜索路径中添加dir 目录。
-L dir 在库文件的搜索路径列表中添加dir目录。
-static 链接静态库。
-library 连接名为library的库文件。
4.例子实质上,上述编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。
4.1 示例程序如下:#include <stdio.h>int main(void){printf("Hello World!\n");return 0;}这个程序,一步到位的编译指令是:gcc test.c -o test该命令结束后,在文件目下生成(可执行文件)test通过./test 可运行本程序。
4.2 预处理gcc -E test.c -o test.i 或gcc -E test.c可以输出test.i文件中存放着test.c经预处理之后的代码。
gcc命令的参数

gcc命令的参数一、介绍GCC(GNU Compiler Collection)是一套广泛使用的编译器工具集,用于编译C、C++、Objective-C、Fortran等多种程序语言。
GCC命令的参数是指在使用GCC编译器时可以添加的选项和参数,通过这些参数可以对编译过程进行控制和定制,以满足不同的需求。
本文将详细介绍GCC命令的参数及其使用方法。
二、常用参数1. -o <file>指定输出文件的名称。
例如,gcc main.c -o main将编译main.c文件并输出可执行文件main。
2. -c只进行编译,不进行链接。
使用该参数可以将源代码编译为目标文件(.o文件),而不生成可执行文件。
3. -E只进行预处理,生成预处理后的代码。
该参数可用于查看预处理后的代码,以便调试和分析。
4. -g生成调试信息。
使用该参数可以在编译过程中生成调试信息,以便在调试程序时进行源代码级别的调试。
5. -Wall打开所有警告信息。
使用该参数可以让编译器输出所有可能的警告信息,帮助开发者发现潜在的问题。
6. -O优化选项。
GCC提供了多个优化选项,例如-O1、-O2、-O3等,可以根据需求选择不同级别的优化。
7. -I <dir>添加头文件搜索路径。
使用该参数可以告诉编译器在指定的目录中搜索头文件。
添加库文件搜索路径。
使用该参数可以告诉编译器在指定的目录中搜索库文件。
9. -l <library>链接指定的库文件。
使用该参数可以告诉编译器链接指定的库文件,例如-lm表示链接数学库。
10. -D <macro>定义宏。
使用该参数可以在编译过程中定义宏,以控制源代码中的条件编译。
三、高级参数1. -Werror将警告视为错误。
使用该参数可以将编译过程中的警告信息视为错误,编译过程将被中断。
2. -std=<standard>指定所使用的语言标准。
GCC支持多个语言标准,例如-std=c11表示使用C11标准。
GCC编译选项参数

GCC编译选项参数1. -o,指定输出文件的名称。
例如,gcc -o output main.c将生成一个名为output的可执行文件。
2.-c,只编译源文件但不链接生成可执行文件。
这个选项可以用于分离编译,将源代码和编译后的目标文件分开存放。
3.-g,生成包含调试信息的可执行文件。
这个选项可用于在程序出错时进行调试。
4. -Wall,显示所有警告信息。
这个选项用于尽可能多地检测潜在的错误。
5. -Werror,将警告视为错误。
这个选项会将所有警告信息转化为编译错误,编译过程中如果遇到任何警告就会停止编译。
6. -std,指定所使用的C或C++的标准版本。
例如,-std=c99指定使用C99标准。
7.-I,指定额外的头文件路径。
可以通过多次使用该选项来指定多个路径。
8.-L,指定额外的库文件路径。
可以通过多次使用该选项来指定多个路径。
9. -l,指定要链接的库文件。
例如,-lmath将链接数学库。
10.-O,指定优化级别。
有多个优化级别可选,从-O0(不进行任何优化)到-O3(进行最高级别的优化)。
11.-D,定义预处理宏。
可以使用-D定义宏并为其指定值。
例如,-DDEBUG定义一个名为DEBUG的宏。
12.-U,取消预定义宏的定义。
可以使用-U取消已定义的宏。
13.-E,只进行预处理,生成预处理后的源代码。
可以通过这个选项将预处理后的代码输出到标准输出或另一个文件中。
14.-S,只进行编译,生成汇编代码。
可以通过这个选项将汇编代码输出到标准输出或另一个文件中。
15. -shared,生成共享库文件。
这个选项可以用于生成可供其他程序调用的动态链接库。
16.-fPIC,生成位置无关的代码。
这个选项可以用于在共享库中使用。
17. -pthread,为多线程程序链接额外的线程库。
18. -march,指定目标处理器的架构。
例如,-march=armv7指定目标处理器是ARMv7架构。
19. -mfpu,指定使用的浮点单元类型。
c语言编译时预输入参数

c语言编译时预输入参数摘要:1.编译过程中的预输入参数2.预输入参数的作用3.常见的预输入参数及其用法正文:在C 语言编程中,编译过程是一个重要的环节。
编译器会将源代码转换为目标文件,以便后续链接和执行。
在编译过程中,预输入参数是一个不可忽视的概念。
本篇文章将为大家介绍C 语言编译时的预输入参数。
一、预输入参数的概念及作用预输入参数是在编译过程中,由编译器读取的输入参数。
它们通常用于指定编译器的行为、目标文件的生成、链接选项等。
预输入参数在编译过程中的作用主要体现在以下几个方面:1.控制编译器的优化程度。
通过设置不同的预输入参数,可以调整编译器的优化级别,从而影响生成的目标文件的大小和执行效率。
2.指定目标文件的生成位置。
预输入参数可以控制目标文件的生成路径和文件名,方便程序员对编译结果进行管理。
3.影响链接过程。
预输入参数可以指定链接器使用的库文件、链接选项等,从而影响最终可执行文件的功能和性能。
二、常见的预输入参数及其用法在C 语言编译过程中,常见的预输入参数包括以下几种:1.-O(优化级别)该参数用于控制编译器的优化程度。
常见的优化级别有-O0(不优化)、-O1(基本优化)、-O2(高级优化)和-O3(最高级优化)。
例如,使用gcc 编译器编译一个源文件,并使用-O2 优化级别,可以执行以下命令:```gcc -O2 source.c -o target```2.-o(目标文件)该参数用于指定编译后生成的目标文件。
例如,使用gcc 编译器编译一个源文件,并生成名为“target”的目标文件,可以执行以下命令:```gcc source.c -o target```3.-I(头文件目录)该参数用于指定编译器在查找头文件时需要搜索的目录。
例如,如果头文件位于“/usr/include”目录下,可以执行以下命令:```gcc -I/usr/include source.c -o target```4.-L(库文件目录)该参数用于指定编译器在链接时需要搜索的库文件目录。
c语言多文件夹下的头文件包含时的路径

在C语言中,当你在多个文件夹中组织代码,并且需要在一个文件中包含另一个文件夹中的头文件时,你可以使用不同的路径指定包含头文件的位置。
以下是一些常见的路径指定方式:
相对路径:使用相对路径来指定头文件的位置。
相对路径是相对于包含头文件的源文件的位置。
例如,如果你的源文件位于项目根目录的子文件夹中,并且头文件也在该子文件夹中,可以这样包含头文件:
#include "subfolder/header.h"
绝对路径:使用绝对路径来指定头文件的位置。
这种方式提供了头文件的完整路径,不依赖于源文件的位置。
例如:
#include "/home/user/project/include/header.h"
编译器选项:你还可以使用编译器选项来指定头文件的搜索路径。
例如,使用gcc编译器的-I 选项来添加头文件搜索路径:
gcc -I/path/to/include -o output_file source_file.c
这将告诉编译器在/path/to/include 文件夹中查找头文件。
环境变量:有些项目使用环境变量来指定头文件的搜索路径。
这种方式需要在编译器中设置相应的环境变量,以告诉编译器在哪里查找头文件。
Makefile:如果你使用Makefile来构建项目,你可以在Makefile中定义头文件搜索路径。
这样,你可以更灵活地管理头文件的包含路径。
要根据项目的特定需求和文件组织方式选择合适的路径指定方式。
通常情况下,相对路径和编译器选项是最常用的方式,因为它们相对简单并且易于维护。
gcc编译参数

gcc编译参数在GCC中,编译参数用于指定编译器的行为和选项。
这些参数可以对代码进行优化、生成调试信息、链接不同的库等等。
以下是一些常用的GCC编译参数:1.优化参数:--O0:不进行优化--O1:进行基本优化--O2:进行更多优化--O3:进行最大优化--Os:进行优化以缩小代码尺寸2.调试参数:--g:生成调试信息- -ggdb:生成GDB可用的调试信息- -gdwarf:生成DWARF调试信息3.警告参数:- -Wall:开启所有警告- -Werror:将所有警告视为错误- -Wextra:开启额外的警告- -Wno-unused-parameter:忽略未使用的函数参数的警告4.标准库参数:- -std=c89:使用C89标准- -std=c99:使用C99标准- -std=c11:使用C11标准- -std=c++98:使用C++98标准- -std=c++11:使用C++11标准- -std=c++14:使用C++14标准- -std=c++17:使用C++17标准5.预处理参数:- -D<symbol>=<value>:定义宏- -U<symbol>:取消宏定义- -I<dir>:指定头文件路径6.链接参数:- -L<dir>:指定库文件路径- -l<library>:链接库文件- -shared:生成共享库- -static:生成静态库7.其他参数:--c:只编译,不链接- -o <output>:指定输出文件名- -Wl,<option>:传递选项给链接器- -Wp,<option>:传递选项给预处理器这只是一小部分常用的GCC编译参数,GCC还提供了许多其他参数用于更精细地控制编译过程。
可以通过运行`gcc --help`命令查看GCC支持的所有编译参数。
linuxgcc命令及用法

linuxgcc命令及用法Linux的gcc命令是一款非常强大的编译器,用于将源代码转换为可执行文件。
本文将详细介绍gcc命令及其常用的用法,帮助读者更好地理解和使用这款工具。
一、gcc命令的基本语法结构gcc是GNU Compiler Collection(GNU编译器集合)的简称,因此其命令基本语法结构一般为:shellgcc [选项] [输入文件]其中,选项用于指定编译时的相关参数,输入文件则是需要编译的源文件。
二、gcc命令的常用选项gcc命令提供了许多选项,用于控制编译过程及生成的可执行文件的属性。
下面是一些常用的gcc选项及其作用:1. -o:用于指定输出文件的名称。
例如,使用`-o myprogram`选项将输出文件命名为myprogram。
2. -c:仅进行编译,不进行链接操作。
这个选项常用于编译多个源文件时,先将每个源文件编译为目标文件,再进行链接操作。
3. -g:生成调试信息。
这个选项会在编译时生成与调试器兼容的调试信息,方便开发人员进行程序调试。
4. -Wall:显示所有警告信息。
使用这个选项可以使编译器在编译时输出更多的警告信息,帮助开发人员提前发现潜在的问题。
5. -I:指定头文件的搜索路径。
使用这个选项可以告诉编译器在指定的路径中查找头文件,方便引用外部库、模块等。
6. -L:指定库文件的搜索路径。
与-I选项类似,这个选项用于告诉编译器在指定的路径中查找库文件,用于链接时的库文件搜索。
7. -l:指定要链接的库文件。
使用这个选项可以显式地告诉编译器要链接的库文件,如:-lmath将链接math库文件。
三、gcc命令的应用实例下面通过几个实例来演示gcc命令的具体用法,以帮助读者更好地理解和掌握这款工具。
1. 编译单个源文件并生成可执行文件假设我们有一个名为`hello.c`的源文件,内容如下:c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}我们可以使用以下命令将其编译为可执行文件`hello`:shellgcc -o hello hello.c编译成功后,即可在当前目录下生成名为`hello`的可执行文件。
gcc10 编译

GCC10编译简介GCC(GNU Compiler Collection)是一套由GNU开源项目开发的编译器集合,用于编译各种编程语言,包括C、C++、Fortran等。
它是一个非常重要的开源工具,被广泛用于开发各种软件和操作系统。
GCC的版本迭代很快,每个新版本都会带来许多新的功能和改进。
本文将重点介绍GCC的最新版本GCC10,并详细说明如何使用GCC10进行编译。
GCC10的新特性GCC10于2020年5月7日发布,带来了许多新的特性和改进,主要包括:1.支持新的编程语言特性:GCC10对C++20标准的支持得到了增强,包括对模块、概念、协程等新特性的支持。
此外,GCC10还对Fortran、Ada等语言进行了改进和扩展。
2.优化和性能改进:GCC10引入了许多新的优化技术,包括基于多线程的代码生成、嵌套函数的优化等。
这些优化能够提高代码的执行效率,减少程序的运行时间。
3.支持新的处理器架构:GCC10增加了对一些新的处理器架构的支持,包括ARM的Cortex-A77、Cortex-A76、Cortex-A65、Cortex-A55等,以及IBM的POWER10等。
4.提升代码质量:GCC10引入了一些新的静态分析工具,可以帮助开发者发现代码中的潜在问题,提升代码的质量和可靠性。
GCC10的安装下面是在Linux系统上安装GCC10的步骤:1.下载GCC10源代码:在GCC的官方网站()上下载GCC10的源代码压缩包。
2.解压源代码压缩包:使用命令行工具解压下载的源代码压缩包,例如使用tar命令:tar -xf gcc-10.2.0.tar.gz。
3.进入源代码目录:使用cd命令进入解压后的源代码目录:cd gcc-10.2.0。
4.配置编译选项:运行./configure命令来配置编译选项,例如指定安装路径等。
5.编译源代码:运行make命令来编译源代码,这个过程可能需要一些时间。
6.安装GCC10:运行make install命令来安装GCC10,安装完成后,GCC10将被安装到指定的安装路径。
GCC编译时头文件路径问题

整理Lin ux下gc c编译中关于头文件与库文件搜索路径相关问题分类: Make File/Make/GCC/L D2010-11-20 23:15 535人阅读评论(0)收藏举报转者的话:本文详细介绍了gcc 编译时搜索头文件的路径以及方式,编译时寻找lib库的方式,以及运行时加载库的寻找方式!!!非常之经典啊!以后有新的知识都汇总到这里来了!在交叉编译的时候我们需要用到其他的库,在confi g时候可以通过“-I”来指定头文件目录,但是每次都需要设置的话难免有些麻烦,找到一个简单的方法。
看下文的红色部分。
有大量的环境变量可供设置以影响G CC 编译程序的方式。
利用这些变量的控制也可使用合适的命令行选项。
一些环境变量设置在目录名列表中。
这些名字和PATH环境变量使用的格式相同。
特殊字符 PAT H_SEP ARATO R (安装编译程序的时候定义)用在目录名之间。
在UNIX系统中,分隔符是冒号,而 Wi ndows系统中为分号。
C_INC LUDE_PATH编译 C程序时使用该环境变量。
该环境变量指定一个或多个目录名列表,查找头文件,就好像在命令行中指定 -isy stem选项一样。
会首先查找 -isy stem指定的所有目录。
==>也见CPATH、 CP LUS_I NCLUD E_PAT H 和O BJC_I NCLUD E_PAT H 。
COMPI LER_P ATH 该环境变量指定一个或多个目录名列表,如果没有指定G CC_EX EC_PR EFIX定位子程序,编译程序会在此查找它的子程序。
==>也见LI BRARY_PATH、 GC C_EXE C_PRE FIX 和 -B 命令行选项。
GCC编译时头文件路径问题

GCC_EXEC_PREFIX 的默认设置为 prefix /lib/gcc-lib/ ,这里的 prefix 是安装编译程序时 configure 脚本指定的名字。该前缀也用于定位标准连接程序文件,包含进来作为可执行程序的一部分。 如果使用 -B 命令行TH 。
方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。
可以通过编辑配置文件/etc/ld.so.conf来指定动态库的搜索路径,该文件中每行为一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。我们通过例1来说明该方法。
例1:
我们通过以下命令用源程序pos_conf.c(见程序1)来创建动态库 libpos.so,详细创建过程请参考文[1]。
网友回复:你引用的是内核下的头文件.
不在/usr/include下.
在: /usr/src/kernels/2.6.18-8.el5-x86_64/include/linux/module.h 下面... 中间的版本号是不一样的...你选你的就行了..
网友回复:请问楼上为什么是在/usr/src/kernels/2.6.18-8.el5-x86_64/include/linux/module.h呢?我查了一下环境变量,没有看到关于头文件的环境变量。gcc是如何知道头文件的位置的?
} 程序1: pos_conf.c
gcc-ld 用法 -回复

gcc-ld 用法-回复gccld 是一款用于编译C 和C++ 代码的开源编译器,被广泛应用于各种操作系统和平台上。
在本文中,将一步一步回答关于gccld 的用法。
1. 安装gccldgccld 是GNU Compiler Collection(GCC)的一部分,因此我们首先需要安装GCC。
对于Linux 系统,可以通过包管理器(如apt、yum 或dnf)来安装GCC。
在终端中运行以下命令即可:sudo apt install gcc对于Windows 系统,可以通过MinGW(Minimalist GNU for Windows)来安装GCC。
可以访问MinGW 的官方网站下载安装程序进行安装。
安装完成后,请确保将GCC 的可执行文件路径添加到系统环境变量中。
2. 编写代码使用gccld 编译C 或C++ 代码之前,我们首先需要编写代码。
可以使用任何文本编辑器来创建一个以 .c 或 .cpp 为扩展名的源代码文件。
以下是一个简单的示例C 代码:c#include <stdio.h>int main() {printf("Hello, World!");return 0;}将以上代码保存为`hello.c`。
3. 编译代码进入终端,并导航到保存`hello.c` 文件的目录中。
使用gccld 命令来编译代码。
运行以下命令:gcc -o hello hello.c该命令中的`-o` 选项用于指定输出文件的名称(这里是`hello`),紧随其后的是源代码文件的名称(这里是`hello.c`)。
编译成功后,将在当前目录中生成一个名为`hello` 的可执行文件。
4. 运行程序通过gccld 编译的程序可以直接运行。
在终端中运行以下命令即可:./hello你将会看到输出:Hello, World!5. 其他常用选项gccld 提供了许多其他选项,来帮助我们更好地控制代码编译。
gcc编译打印详细

gcc编译打印详细1.引言1.1 概述在编译程序时,gcc是一种常用的编译器,它具有强大的功能和广泛的应用。
gcc编译器不仅可以将源代码翻译成可执行程序,还可以通过一系列选项进行配置和优化,以满足开发者的需求。
然而,在开发过程中,有时候我们需要更加详细的编译信息来帮助我们定位问题或者优化程序。
本文将重点介绍如何通过gcc的编译选项来打印详细的编译信息。
本文主要包括以下几个方面内容。
首先,我们将简要介绍gcc编译器的一些基本知识,包括它的功能和特点。
然后,我们会详细介绍gcc的编译选项,包括常用的选项和其作用。
接着,我们将通过实例来演示如何使用这些选项来打印详细的编译信息。
最后,我们会总结gcc编译打印详细的意义和应用,并给出一些建议。
通过本文的学习,读者可以更加深入地了解gcc编译器的使用方法,掌握如何使用gcc的编译选项来打印详细的编译信息。
同时,读者还可以进一步探索gcc编译器的其他高级特性,以提高程序的性能和质量。
本文适用于具有一定编程基础的读者,希望能够帮助读者更好地理解和应用gcc编译器。
同时,本文也是一个详细的参考文档,读者可以随时查阅相关内容。
下一节将进一步介绍本文的结构和目标,希望读者能够跟随文章的逻辑来更好地理解和应用gcc编译打印详细的技巧。
1.2 文章结构本文主要围绕着gcc编译器的详细打印展开,以便更好地了解gcc编译过程中的细节。
下面是本文的大致结构。
第一部分是引言部分,其中包括概述、文章结构和目的。
在概述部分,将简要介绍gcc编译器的基本概念和作用。
然后,在文章结构部分,将详细说明本文的整个结构和各个部分的内容。
最后,目的部分将说明本文撰写的目标和意义。
第二部分是正文部分,主要分为两个小节,分别介绍gcc编译器的概述和gcc编译选项。
在gcc编译器介绍部分,将详细介绍gcc编译器的起源、特点和使用场景。
然后,在gcc编译选项部分,将系统地介绍gcc编译器中常用的编译选项,以及它们的作用和用法。
gcc编译动态库文件路径制定方法

gcc编译动态库文件路径制定方法在GCC编译动态库时,可以通过指定文件路径来告诉编译器在哪里查找源文件和依赖的库文件。
这样可以方便地将不同目录下的源文件和库文件组合在一起编译成动态库。
下面将详细介绍GCC编译动态库时文件路径指定的方法。
1.指定源文件路径:在GCC编译动态库时,可以使用-I选项指定头文件的路径,该路径可以是绝对路径或相对路径。
例如,假设动态库的源文件放在src目录下,可以使用以下命令指定源文件路径:gcc -c -I./src file.c -o file.o这样,GCC会在当前目录下的src目录中查找file.c源文件,并将编译结果保存到file.o中。
2.指定库文件路径:在GCC编译动态库时,可以使用-L选项指定库文件的路径,该路径可以是绝对路径或相对路径。
例如,假设动态库的依赖库文件放在lib目录下,可以使用以下命令指定库文件路径:gcc -L./lib -o libmylib.so file1.o file2.o -ldependency这样,GCC会在当前目录下的lib目录中查找依赖库文件,并链接到生成的动态库中。
3.设置环境变量:除了通过命令行参数指定文件路径外,还可以通过设置环境变量来告诉GCC查找文件的路径。
例如,可以使用以下命令设置头文件路径的环境变量:export C_INCLUDE_PATH=/path/to/include这样,GCC在编译时会自动在指定的路径中查找头文件。
类似地,可以使用以下命令设置库文件路径的环境变量:export LD_LIBRARY_PATH=/path/to/lib这样,GCC在链接时会自动在指定的路径中查找库文件。
4.编译多个源文件:在编译动态库时,一般会将多个源文件一起编译成目标文件,然后再链接成动态库。
可以通过指定源文件路径和库文件路径来实现这一操作。
例如,假设动态库的源文件分别为file1.c和file2.c,依赖的库文件为dependency1.so和dependency2.so,可以使用以下命令来编译和链接动态库:gcc -c -I./src file1.c -o file1.ogcc -c -I./src file2.c -o file2.ogcc -L./lib -o libmylib.so file1.o file2.o -ldependency1 -ldependency2这样,GCC会分别在当前目录下的src目录中查找file1.c和file2.c源文件,并将编译结果保存到file1.o和file2.o中。
GCC编译命令

GCC编译命令今天突然被同事问道⼀个GCC编译命令的问题,感觉对相应内容⽣疏了,赶紧整理下相关内容,梳理下相关知识。
GCC命令提供了⾮常多的命令选项,但并不是所有都要熟悉,初学时掌握⼏个常⽤的就可以了,到后⾯再慢慢学习其它选项,免得因选项太多⽽打击了学习的信⼼。
⼀. 常⽤编译命令选项假设源程序⽂件名为test.c。
1. ⽆选项编译链接⽤法:#gcc test.c作⽤:将test.c预处理、汇编、编译并链接形成可执⾏⽂件。
这⾥未指定输出⽂件,默认输出为a.ou t。
2. 选项 -o⽤法:#gcc test.c -o test作⽤:将test.c预处理、汇编、编译并链接形成可执⾏⽂件test。
-o选项⽤来指定输出⽂件的⽂件名。
3. 选项 -E⽤法:#gcc -E test.c -o test.i作⽤:将test.c预处理输出test.i⽂件。
4. 选项 -S⽤法:#gcc -S test.i作⽤:将预处理输出⽂件test.i汇编成test.s⽂件。
5. 选项 -c⽤法:#gcc -c test.s作⽤:将汇编输出⽂件test.s编译输出test.o⽂件。
6. ⽆选项链接⽤法:#gcc test.o -o test作⽤:将编译输出⽂件test.o链接成最终可执⾏⽂件test。
7. 选项-O⽤法:#gcc -O1 test.c -o test作⽤:使⽤编译优化级别1编译程序。
级别为1~3,级别越⼤优化效果越好,但编译时间越长。
⼆. 多源⽂件的编译⽅法如果有多个源⽂件,基本上有两种编译⽅法:[假设有两个源⽂件为test.c和testfun.c]1. 多个⽂件⼀起编译⽤法:#gcc testfun.c test.c -o test作⽤:将testfun.c和test.c分别编译后链接成test可执⾏⽂件。
2. 分别编译各个源⽂件,之后对编译后输出的⽬标⽂件链接。
⽤法:#gcc -c testfun.c //将testfun.c编译成testfun.o#gcc -c test.c //将test.c编译成test.o#gcc -o testfun.o test.o -o test //将testfun.o和test.o链接成test以上两种⽅法相⽐较,第⼀中⽅法编译时需要所有⽂件重新编译,⽽第⼆种⽅法可以只重新编译修改的⽂件,未修改的⽂件不⽤重新编译。
GCC编译器的搜寻路径

GCC编译器的搜寻路径一、头文件gcc 在编译时寻找所需要的头文件:※搜寻会从-I开始※然后找gcc的环境变量C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH※再找内定目录/usr/include/usr/local/include/usr/lib/gcc-lib/i386-linux/2.95.2/include/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include库文件但是如果装gcc的时候,是有给定的prefix的话,那么就是/usr/includeprefix/includeprefix/xxx-xxx-xxx-gnulibc/includeprefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include二、库文件编译的时候:※gcc会去找-L※再找gcc的环境变量LIBRARY_PATH※再找内定目录/lib:/usr/lib:/usr/local/lib:这是当初compile gcc时写在程序内的三、运行时动态库的搜索路径1、在配置文件/etc/ld.so.conf中指定动态库搜索路径2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)3、在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。
这是通过gcc 的参数"-Wl,-rpath,"指定。
当指定多个动态库搜索路径时,路径之间用冒号":"分隔4、默认的动态库搜索路径/lib /usr/lib可以通过执行可执行文件pos得到的结果不同获知其搜索到了哪个动态库,从而获得第1个动态库搜索顺序,然后删除该动态库,再执行程序pos,获得第2个动态库搜索路径,再删除第2个被搜索到的动态库,如此往复,将可得到Linux搜索动态库的先后顺序。
Linux下gcc编译中关于头文件与库文件搜索路径相关问题

Linux下gcc编译中关于头文件与库文件搜索路径相关问题(2011-05-11 15:27:50)如何指定gcc的默认头文件路径在交叉编译的时候我们需要用到其他的库,在config 时候可以通过“-I” 来指定头文件目录,但是每次都需要设置的话难免有些麻烦,找到一个简单的方法。
看下文的红色部分。
有大量的环境变量可供设置以影响GCC 编译程序的方式。
利用这些变量的控制也可使用合适的命令行选项。
一些环境变量设置在目录名列表中。
这些名字和PATH 环境变量使用的格式相同。
特殊字符PATH_SEPARATOR (安装编译程序的时候定义)用在目录名之间。
在UNIX 系统中,分隔符是冒号,而Windows 系统中为分号。
C_INCLUDE_PATH编译C 程序时使用该环境变量。
该环境变量指定一个或多个目录名列表,查找头文件,就好像在命令行中指定-isystem 选项一样。
会首先查找-isystem 指定的所有目录。
==> 也见CPATH 、CPLUS_INCLUDE_PATH 和OBJC_INCLUDE_PATH 。
COMPILER_PATH该环境变量指定一个或多个目录名列表,如果没有指定GCC_EXEC_PREFIX 定位子程序,编译程序会在此查找它的子程序。
==> 也见LIBRARY_PATH 、GCC_EXEC_PREFIX 和-B 命令行选项。
CPATH编译C 、C++ 和Objective-C 程序时使用该环境变量。
该环境变量指定一个或多个目录名列表,查找头文件,就好像在命令行中指定-l 选项一样。
会首先查找-l 指定的所有目录。
==> 也见C_INCLUDE_PATH 、CPLUS_INCLUDE_PATH 和OBJC_INCLUDE_PATH 。
CPLUS_INCLUDE_PATH编译C++ 程序时使用该环境变量。
该环境变量指定一个或多个目录名列表,查找头文件,就好像在命令行中指定-isystem 选项一样。
gcc指定头文件路径及动态链接库路径

gcc指定头⽂件路径及动态链接库路径gcc指定头⽂件路径及动态链接库路径本⽂详细介绍了linux 下gcc头⽂件指定⽅法,以及搜索路径顺序的问题。
另外,还总结了,gcc动态链接的⽅法以及路径指定,同样也讨论了搜索路径的顺序问题。
本⽂包含了很多的例⼦,具有很强的操作性,希望读者⾃⼰去⾛⼀遍。
⼀.#include <>与#include “”#include <>直接到系统指定的某些⽬录中去找某些头⽂件。
#include “”先到源⽂件所在⽂件夹去找,然后再到系统指定的某些⽬录中去找某些头⽂件。
⼆.gcc指定头⽂件的三种情况:1.会在默认情况下指定到/usr/include⽂件夹(更深层次的是⼀个相对路径,gcc可执⾏程序的路径是/usr/bin/gcc,那么它在实际⼯作时指定头⽂件头径是⼀种相对路径⽅法,换算成绝对路径就是加上/usr/include,如#include 就是包含/usr/include/stdio.h)2.GCC还使⽤了-I指定路径的⽅式,即gcc -I 头⽂件所在⽂件夹(绝对路径或相对路径均可) 源⽂件举⼀个例⼦:设当前路径为/root/test,其结构如下:include_test.cinclude/include_test.h有两种⽅法访问到include_test.h。
1. include_test.c中#include “include/include_test.h”然后gcc include_test.c即可2. include_test.c中#include 或者#include 然后gcc –I include include_test.c也可3. 参数:-nostdinc使编译器不再系统缺省的头⽂件⽬录⾥⾯找头⽂件,⼀般和-I联合使⽤,明确限定头⽂件的位置。
在编译驱动模块时,由于⾮凡的需求必须强制GCC不搜索系统默认路径,也就是不搜索/usr/include要⽤参数-nostdinc,还要⾃⼰⽤-I参数来指定内核头⽂件路径,这个时候必须在Makefile中指定。
CMake编译中的库文件和头文件链接你了解吗

CMake编译中的库⽂件和头⽂件链接你了解吗⽬录外部库⽂件、头⽂件链接指令头⽂件搜索路径链接库⽂件实例新建⼯程空间定义src内容编译总结外部库⽂件、头⽂件链接指令头⽂件搜索路径INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)[AFTER|BEFORE] :添加⽅式,默认AFTER AFTER:在后⽅进⾏追加内容(新加⼊内容在后)BEFORE:在前⽅进⾏追加内容(新加⼊内容在前)dir:头⽂件路径地址,含有空格的路径应⽤双引号括起链接库⽂件LINK_DIRECTORIES(directory1 directory2 ...)directory:库⽂件名称该指令⽤于添加⾮标准共享库搜索路径。
TARGET_LINK_LIBRARIES(target library1 <debug | optimized>library2 ...)target:被链接的对象library:库名称实例此处采⽤之前⽣成安装好的库⽂件libhello.so进⾏演⽰。
新建⼯程空间⾸先,新建⼯程⽂件并定义⼯程CMakeLists.txt⽂件。
# 新建⼯程空间t4mkdir -p ~/cmake_test/t4cd ~/cmake_test/t4# 新建⼦⽬录srcmkdir src# 新建⼯程CMakeLists.txtvim CMakeLists.txt⼦⽬录src⽤于存放源代码,⼯程根⽬录下的CMakeLists.txt内容如下:# ⼯程名PROJECT(NEWHELLO)# 添加源码⽬录ADD_SUBDIRECTORY(src)定义src内容进⼊⼦⽬录src,新建源⽂件main.cpp# 进⼊src⼦⽬录cd ~/cmake_test/t4/src# 新建源⽂件vim main.cppmain.cpp⽂件内容如下:// main.cpp#include <iostream>using namespace std;int main(){HelloFunc();return 0;}源⽂件中调⽤了之前封装的HelloFunc函数,应将其头⽂件及链接进⾏定义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
gcc编译链接时指定头文件和库文件搜索路径
2010-05-24 18:16
问题:
sudo gcc rongji_ssl.c -lssl
提示找不到openssl/ssl.h等头文件的错误
原因:
gcc在系统默认指定的头文件搜索目录下没找到,默认的头文件搜索目录为:
/usr/include
/usr/local/include
以及/usr/lib/gcc下的一些include目录
注意以上搜索目录也包含子目录!
解决:
方法1:sudo cp -rf /usr/local/ssl/include/openssl /usr/include/
方法2:在编译后面加-I/usr/local/ssl/include
================================================
解决了上面问题后,sudo gcc rongji_ssl.c -lssl又出现了一个新问题:
/usr/bin/ld: cannot find -lssl
原因:gcc在默认的库搜索路径下找不到ssl库文件。
默认的库(包括动、静态库)搜索路径为:
/lib、/usr/lib、/usr/local/lib、
另外动态库搜索路径还可以由:
LD_LIBRARY_PATH环境变量(profile中定义)、/etc/ld.so.conf中指定。
与添加头文件搜索路径类似,在编译时添加-L参数可指定搜索动、静态库的路径。
默认情况下,gcc在链接时优先使用动态库,只有当动态库不存在时才考虑使用静态库,如果需要的话可以在编译时加上-static选项,强制使用静态库。
如:gcc foo.c -L /home/xiaowp/lib -static -lfoo
解决:
通过查找,当前的ssl库为:
/usr/lib/libssl.so.0.9.8
/usr/local/ssl/lib/libssl.a
因此上面的解决方法有:
方法1:在编译后面加-L/usr/local/ssl/lib,使gcc找到并使用静态库。
方法2:sudo ln -s /usr/lib/libssl.so.0.9.8 /usr/lib/libssl.so,这样就能找到动态库了。