gcc 32位编译
gcc 32位编译
GCC是GNU Compiler Collection的缩写,是一款优秀的C、C++等编程语言的编译器。
在Linux系统中,GCC是C、C++等程序员的必备开发工具之一。
本文主要介绍GCC在32
位操作系统下的中文编译方法。
一、安装GCC
GCC在Linux系统中早已被集成,不需要进行额外的安装。
如果没有安装GCC,可以
使用以下命令进行安装:
Ubuntu/Debian系统:
sudo apt-get update
CentOS/RHEL系统:
sudo yum install gcc
二、添加中文支持
GCC默认是不支持中文的,需要使用-finput-charset=utf-8选项开启中文编译支持。
例如:
gcc -finput-charset=utf-8 -o hello hello.c
三、文件编码
为了确保GCC能够正确解析和编译中文字符,需要将源代码文件保存为UTF-8编码格式。
在Linux中,使用以下命令可以将文件转换为UTF-8编码格式:
其中,hello.c为转换后的文件名,hello-gbk.c为原文件名。
四、环境变量配置
为了方便使用GCC,可以将GCC命令添加到系统环境变量中。
具体操作如下:
1. 在终端中打开.bashrc文件:
vi ~/.bashrc
2. 在文件末尾添加以下两行:
export PATH=$PATH:/usr/local/gcc/bin
export LANG=C.UTF-8
3. 保存退出,执行以下命令更新环境变量:
五、测试
使用以下命令测试GCC是否能够正确识别和编译中文字符:
echo 'int main(){printf("你好,世界!\n");return 0;}' > hello.c
./hello
如果能够正常输出“你好,世界!”,则说明GCC已经支持中文编译。
六、总结
通过本文的介绍,可以了解GCC在32位操作系统下的中文编译方法。
需要注意的是,为了确保编译成功,需要将源代码文件保存为UTF-8编码格式,并在编译命令中开启中文
支持。
同时,为了方便使用,可以将GCC命令添加到系统环境变量中。
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支持的所有编译参数。
gcc编译的详细步骤
gcc编译的详细步骤⼀:GCC⼀般编译建⽴hello.c# vi hello.c#include <stdlib.h>#include <stdio.h>void main(void){printf("hello world!\r\n");}⽤gcc编译成执⾏程序。
#gcc -o hello hello.c该命令将hello.c直接⽣成最终⼆进制可执⾏程序a.out这条命令隐含执⾏了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的⼆进制可执⾏程序。
这⾥未指定输出⽂件,默认输出为a.out。
如何要指定最终⼆进制可执⾏程序名,那么⽤-o选项来指定名称。
⽐如需要⽣成执⾏程序hello.exe那么#gcc hello.c -o hello.exe⼆:GCC编译详细步骤,分为四步:从上⾯我们知道GCC编译源代码⽣成最终可执⾏的⼆进制程序,GCC后台隐含执⾏了四个阶段步骤。
GCC编译C源码有四个步骤:预处理-----> 编译 ----> 汇编 ----> 链接现在我们就⽤GCC的命令选项来逐个剖析GCC过程。
1)预处理(Pre-processing)在该阶段,编译器将C源代码中的包含的头⽂件如stdio.h编译进来,⽤户可以使⽤gcc的选项”-E”进⾏查看。
⽤法:#gcc -E hello.c -o hello.i作⽤:将hello.c预处理输出hello.i⽂件。
[root]# gcc -E hello.c -o hello.i[root]# lshello.c hello.i[root]# vi hello.i# 1 "hello.c"# 1 "<built-in>"# 1 "<command line>"# 1 "hello.c"# 1 "/usr/include/stdlib.h" 1 3# 25 "/usr/include/stdlib.h" 3# 1 "/usr/include/features.h" 1 3# 291 "/usr/include/features.h" 3# 1 "/usr/include/sys/cdefs.h" 1 3# 292 "/usr/include/features.h" 2 3# 314 "/usr/include/features.h" 3# 1 "/usr/include/gnu/stubs.h" 1 3# 315 "/usr/include/features.h" 2 3# 26 "/usr/include/stdlib.h" 2 3# 3 "hello.c" 2void main(void){printf("hello world!\r\n");}2)编译阶段(Compiling)第⼆步进⾏的是编译阶段,在这个阶段中,Gcc⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,Gcc把代码翻译成汇编语⾔。
gcc -fPIC编译选项分析
gcc -fPIC编译选项分析1、-fPIC 作用于编译阶段,在编译动态库时(.so文件)告诉编译器产生与位置无关代码(Position-Independent Code),若未指定-fPIC选项编译.so文件,则在加载动态库时需进行重定向。
2、64位编译器下编译生成动态库时,出现以下错误:/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-li nux/bin/ld: ../../CI/script/server/lib/libz.a(adler32.o): relocation R_X86_64_32 against `.text' can not be used when making a shared object; recompile with -fPIC../../CI/script/server/lib/libz.a: could not read symbols: Bad value原因:提示说需要-fPIC编译,然后在链接动态库的地方加上-fPIC的参数编译结果还是报错,需要把共享库所用到的所有静态库都采用-fPIC编译一遍,才可以成功的在64位环境下编译出动态库。
3、为何在32位的编译器下编译,就不会报错呢?对于我们的32位环境来说, 编译时是否加上-fPIC, 都不会对链接产生影响, 只是一份代码的在内存中有几个副本的问题(而且对于静态库而言结果都是一样的).但在64位的环境下装载时重定位的方式存在一个问题就是在我们的64位环境下用来进行位置偏移定位的cpu指令只支持32位的偏移, 但实际中位置的偏移是完全可能超过64位的,所以在这种情况下编译器要求用户必须采用fPIC的方式进行编译的程序才可以在共享库中使用。
C语言编译器gcc命令如何操作步骤
C语言编译器gcc命令如何操作步骤C语言是一种高级编程语言,由于其结构化编程,声明式语法,高效性和可靠性,被广泛用于很多领域。
gcc是一种C语言编译器,是Unix系统中最常用的编译器之一,它可以编译C、C++、JAVA等语言。
本文将为读者介绍对于gcc编译器的基本概念、相关命令以及实践操作步骤。
一、gcc基本概念1. 什么是编译器?先来了解一下编译器的作用。
编译器是将高级语言编写的程序转换成计算机可执行的机器语言的软件程序。
程序员可以使用高级语言编写程序,编译器将高级语言转换成计算机能够理解的机器语言。
2. 什么是gcc?GCC是GNU编译器集合(GNU Compiler Collection)的缩写。
它是一个重要的语言编译器,可以编译C、C++、JAVA等语言的程序。
gcc包含了一系列的编译器,每一个编译器都可以编译不同的语言,它不仅是Linux系统中的常用编译器,也被广泛使用于其他操作系统中。
3. gcc优点- 开源软件:可以透明、高效地利用计算机系统资源,让整个编译过程更灵活。
- 软件体积小:由于每次都是重新编译,因此gcc生成的二进制文件体积很小。
- 可移植性:gcc可以在不同的操作系统上进行编译。
同一份源代码,在不同的系统上编译,可以得到相同的结果。
- 动态链接库:gcc支持动态链接库,可以减少程序的代码冗余问题。
二、gcc常用命令以下是gcc编译器的常用命令:1. gcc -ogcc命令使用" -o"选项可以把源文件编译成可执行文件,例如:```$ gcc -o hello hello.c```上述命令的含义是将hello.c文件编译成hello可执行文件。
2. gcc -cgcc命令使用" -c"选项将源文件编译成目标文件。
目标文件是不可执行的文件,它包含了已经编译过的程序的一部分,这些程序可以用作最终的可执行文件中的一部分。
例如:```$ gcc -c hello.c```上述命令的含义是将hello.c文件编译成目标文件hello.o。
gcc 32位编译参数
gcc 32位编译参数【原创版】目录1.编译器 GCC 简介2.32 位编译参数的作用3.常用的 32 位编译参数4.编译参数的实际应用正文1.编译器 GCC 简介GCC(GNU Compiler Collection)是一款开源的编译器套件,主要用于 C、C++等语言的编译。
GCC 支持多种平台和架构,可以生成高效的可执行文件。
其中,32 位编译参数是 GCC 在编译过程中非常重要的选项之一。
2.32 位编译参数的作用32 位编译参数主要用于指定编译器在编译时使用 32 位数据模型。
相较于 64 位数据模型,32 位数据模型具有较低的内存占用和更快的运行速度。
因此,在一些特定的场景下,使用 32 位编译参数可以提高程序的性能。
3.常用的 32 位编译参数常用的 32 位编译参数主要有以下几种:- `-m32`:使用 32 位数据模型进行编译。
- `-m32-abi`:指定 32 位 ABI(应用程序二进制接口),例如`-m32-abi=apcs-32`。
- `-m32-relaxed-alignment`:允许 32 位数据模型中的内存地址不对齐。
- `-m32-膨压-all-address-spaces`:允许在 32 位数据模型中使用所有地址空间。
4.编译参数的实际应用在实际应用中,根据不同的需求和场景,可以选择合适的 32 位编译参数。
例如,在嵌入式系统中,由于资源有限,通常会选择 32 位数据模型以降低内存占用。
而在高性能计算场景下,为了追求更快的运行速度,也会选择 32 位数据模型。
总之,32 位编译参数在 GCC 编译过程中具有重要作用。
gcc编译过程的四个阶段 命令
gcc编译过程的四个阶段命令嘿,朋友们!今天咱就来唠唠 gcc 编译过程的四个阶段和那些相关的命令。
你知道吗,gcc 编译就像是一场奇妙的旅程。
首先呢,是预处理阶段,这就好比是给原材料进行初步的加工和整理。
在这个阶段,那些宏定义啊、头文件包含啊啥的都被处理好了。
就好像做饭前要把食材都准备好一样。
然后就是编译阶段啦,这时候代码就开始被翻译成机器能懂的语言啦,就跟咱学外语似的,得把咱说的话翻译成别的语言人家才能懂嘛。
接着呢,是汇编阶段,这就像是把翻译好的东西再进一步整理、组合,变成更有条理的形式。
最后就是链接阶段啦,这可是把各个部分都连接起来,形成一个完整的可执行文件,就像搭积木一样,把一块块小积木搭建成一个漂亮的大城堡。
那这每个阶段都有哪些命令呢?预处理阶段常用的命令就是 gcc -E 啦,它能让你看到预处理后的结果哦,是不是很神奇?编译阶段呢,就是 gcc -S 啦,它能生成汇编代码呢。
汇编阶段就用 gcc -c 呀,能得到目标文件。
而链接阶段呢,那就是 gcc 啦,直接生成可执行文件。
你想想看,要是没有这些命令,gcc 编译过程不就像没头苍蝇一样乱撞啦?这就好比你要去一个地方,没有地图和导航,那不得迷路呀!而且啊,理解了这些阶段和命令,你就能更好地掌控整个编译过程啦。
就像你掌握了一门绝世武功的秘籍一样,是不是感觉自己瞬间厉害了起来?比如说,你在写代码的时候遇到了一些奇怪的问题,这时候你要是了解gcc 编译过程,就能通过查看不同阶段的输出,找到问题所在呀。
这就跟医生看病似的,得先做各种检查,才能知道病因在哪儿,然后对症下药嘛。
所以啊,朋友们,可别小瞧了这gcc 编译过程的四个阶段和命令哦。
它们就像是你的得力助手,能帮你写出更棒的代码,让你的程序跑得更顺畅。
反正我觉得啊,这 gcc 编译过程真的很有意思,也很重要。
你要是还没搞懂,那就赶紧去研究研究吧,相信你一定会有新的收获和惊喜的!咋样,还不赶紧行动起来?。
GCC for Win32 开发环境介绍
第二节 入乡随俗的 MinGW
简介
MinGW 是 Minimalistic GNU for Windows 的缩写。她是一个建立在 GCC 和 binutils 项 目上的编译器系统。和其他 GCC 的移植版相比,她可以说是最接近 Win32 的一个了。因为, MinGW 几乎支持所有的 Win32API,这也是 MinGW 的特色之一。她所连接的程序,不需要 任何第三方库就可以运行了。在某种程度上看,MinGW 更像是 VC 的替代品。
总体来说,两种方法各有长处。不过,本人偏爱第一中方法。因为,控制度高,而且, 更新也比较简单。自己心里也比较明了。
环境设置:
对于我们这些使用者来说,最好是能够简单方便的使用工具。所以,我们就需要设置环 境,便于我们使用 MinGW。
对于设置,我们只需要在环境变量中的 PATH 变量中,添加$(MINGW)/bin 这个路径就 可以了。
使用
相对来说,Djgpp 我并不是经常使用。所以,本文中在没有特殊说明情况下,不会使用 Djgpp 的。
文外音:
总体来说,这篇文章写的有些匆忙。所以可能有些地方有不足。所以,希望各位能够多 多原谅批评和指教。下一章,我将介绍 GCC for Win32 的 IDE。同时,从这一章开始,我将 向各位读者做一个小小的要求。那就是,希望你们能够将自己对这篇文章感到的不足告诉我, 我将随时修改以发表的内容,以适合广大读者的要求。如果各位有什么想法或者意见,疑惑。 希望您能到 /visioncat 上提出。
获得与安装
Djgpp,可以从 Djgpp 的官方网站上下载 /djgpp/ 不过,这里 Djgpp 为用户做了更好多的安排。她为用户提供了一个定制安装的页面。 /djgpp/zip-picker.html 您只需要在上面填写响应的内容,然后递交。她将会给你一份完整的安装方案。
常见gcc编译问题解决方法集
常见gcc编译问题解决⽅法集除⾮明确说明,本⽂内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录⼀下(加粗字体是关键词):⽤“-Wl,-Bstatic”指定链接静态库,使⽤“-Wl,-Bdynamic”指定链接共享库,使⽤⽰例:-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest ("-Wl"表⽰是传递给链接器ld的参数,⽽不是编译器gcc/g++的参数。
)1) 下⾯是因为没有指定链接参数-lz(/usr/lib/libz.so,/usr/lib/libz.a )/usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_uncompress':/home/software/mysql-5.5.24/mysys/my_compress.c:122: undefined reference to `uncompress'/usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_compress_alloc':/home/software/mysql-5.5.24/mysys/my_compress.c:71: undefined reference to `compress'2) 下⾯是因为没有指定编译链接参数-pthread(注意不仅仅是-lpthraed)/usr/local/mysql/lib/mysql/libmysqlclient.a(charset.c.o): In function `get_charset_name':/home/zhangsan/mysql-5.5.24/mysys/charset.c:533: undefined reference to `pthread_once'3) 下⾯这个是因为没有指定链接参数-lrt/usr/local/thirdparty/curl/lib/libcurl.a(libcurl_la-timeval.o): In function `curlx_tvnow':timeval.c:(.text+0xe9): undefined reference to `clock_gettime'4) 下⾯这个是因为没有指定链接参数-ldl/usr/local/thirdparty/openssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':dso_dlfcn.c:(.text+0x4c): undefined reference to `dlopen'dso_dlfcn.c:(.text+0x62): undefined reference to `dlsym'dso_dlfcn.c:(.text+0x6c): undefined reference to `dlclose'5) 下⾯这个是因为指定了链接参数-static,它的存在,要求链接的必须是静态库,⽽不能是共享库ld: attempted static link of dynamic object如果是以-L加-l⽅式指定,则⽬录下必须有.a⽂件存在,否则会报-l的库⽂件找不到:ld: cannot find -lACE6) GCC编译遇到如下的错误,可能是因为在编译时没有指定-fPIC,记住:-fPIC即是编译参数,也是链接参数relocation R_x86_64_32S against `vtable for CMyClass` can not be used when making a shared object7) 下⾯的错误表⽰gcc编译时需要定义宏__STDC_FORMAT_MACROS,并且必须包含头⽂件inttypes.htest.cpp:35: error: expected `)' before 'PRIu64'8) 下⾯是因为在x86机器(32位)上编译没有指定编译参数-march=pentium4../../src/common/libmooon.a(logger.o): In function `atomic_dec_and_test':../../include/mooon/sys/atomic_gcc.h:103: undefined reference to `__sync_sub_and_fetch_4'9) 下列错误可能是因为多了个“}”error: expected declaration before '}' token10) 下列错误可能是因为少了个“}”error: expected `}' at end of input11) 下⾯这个错误是编译⼀个共享库时,该共享库依赖的⼀静态库编译时没有加“-fPIC”参数,解决⽅法为带“-fPIC”重新编译被依赖的静态库relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC12) 下⾯这个错误,是因为头⽂件中使⽤“_syscall0(pid_t, gettid)”不当引起的./test.o: In function `gettid()':./test.h:17: multiple definition of `gettid()'正确的⽤法是使⽤"inline"或"static inline"修饰⼀下:inline _syscall0(pid_t, gettid)或static inline _syscall0(pid_t, gettid)当然也可以这样:在.h头⽂件中:extern "C" pid_t gettid(void);在.cpp⽂件中:_syscall0(pid_t, gettid)_syscall0是⼀个宏,定义⼀个函数的实现。
gcc 32位编译参数
gcc 32位编译参数摘要:1.GCC 简介2.32 位编译参数的作用3.常见的32 位编译参数4.参数的实际应用案例5.总结正文:GCC(GNU Compiler Collection)是一个开源的编译器套件,广泛应用于各种操作系统和平台。
在32 位系统中,合理使用编译参数能够优化程序性能和代码可读性。
32 位编译参数主要针对32 位系统的特点进行优化,例如优化内存使用、提高代码执行效率等。
这些参数对于针对32 位系统进行开发的程序员非常重要。
常见的32 位编译参数包括:- `-m32`:指定编译器将源代码编译为32 位代码。
- `-march=i386`:指定目标处理器为i386 架构,适用于32 位系统。
- `-O2`:开启二级优化,提高编译速度和程序运行速度。
- `-fomit-frame-pointer`:省略函数调用帧指针,减小代码体积。
- `-ffunction-sections`:为每个函数生成一个独立的节,提高代码可读性。
- `-fdata-sections`:为每个数据块生成一个独立的节,优化内存布局。
以下是一个实际应用案例:```gcc -m32 -march=i386 -O2 -fomit-frame-pointer -ffunction-sections -fdata-sections input.c -o output```这个命令集使用了上述提到的多个参数,将输入.c 文件编译为32 位可执行文件。
通过合理搭配参数,程序员可以针对具体需求优化编译结果。
总之,了解和熟练使用32 位编译参数对于开发者在32 位系统中编写高效、可移植的代码具有重要意义。
【GCC】gcc警告选项汇总--编辑中gcc编译选项
【GCC】gcc警告选项汇总--编辑中gcc编译选项⽬录参考原⽂:https:///qq_17308321/article/details/79979514前⾔警告:不是错误的,但是有风险或表明可能有错误。
英⽂原⽂:请求或取消警告选项加上-Wall吧,gcc 默认不加参数的情况下连定义了返回值的函数没有返回值都不报错。
-Wall,-Wextra 就是加-Wall 和-Wall不启动的选项也加上()-fsyntax-only检查代码中的语法错误,但除此之外不要做任何事情。
-w (⼩写)禁⽌所有警告消息。
-W (⼤写)以“ -W ”请求特定的警告 - 可以隐式地请求隐式声明的警告。
-W和-Wall的区别-Wall选项意思是编译后显⽰所有警告。
-W选项类似-Wall,会显⽰警告,但是只显⽰编译器认为会出现错误的警告。
在编译⼀些项⽬的时候可以-W和-Wall选项⼀起使⽤。
gcc -W -Wall test_w_wall testwwall.c-Werror=将指定的警告转换为错误。
请注意,指定-Werror = foo会⾃动隐含-W foo 。
但是, -Wno-error = foo并不意味着什么。
反过来:-Wno-error取消编译选项-Werror⽤途:假设我们使⽤了⼀个⼈的代码A⽬录,⾥⾯有⼀个-Werror的选项,把所有的警告当做错误;⼜使⽤了另⼀个⼈的代码B⽬录,⾥⾯存在⼀堆Warning。
这样,当我们把它们合在⼀起编译的时候,A中的-Werror选项会导致B的代码编译不过。
但我们⼜不想去修改B的代码,怎么办?⽅法是,先add_subdirectory(A),之后,加上⼀句set(CMAK_CXX_FLAGS "${CMAK_CXX_FLAGS} -Wno-error")-Wno-这个前缀,就是⽤来取消⼀个编译选项的然后,再add_subdirectory(B)-Wfatal-errors在发⽣第⼀个错误时中⽌编译。
