
格式 gcc [option] [sourcefilename]
介绍一些常用的选项:最简单的是:gcc helloc
默认的情况下将生成aout的可执行性文件,你只需要在终端上输入/aout就可以看到执行的结果
如果你想指定生成目标文件的名字那么你可以加上 -o选项,命令如下:
gcc -o hello helloc
命令如下:
gcc -c hello helloc
理论上安装支持环境,之后64位的gcc编译成32位程序,就加-m32参数即可。
当然还一个办法是装个32位的gcc。
另外,交叉编译也适用于x86架构。
不过这么编译经常会出现各种问题,所以编译32位的程序,最好还是用32位系统。
不一定重装,用chroot和setarch命令配合即可弄出一个32位的子系统。
一般64位系统最好不要安装32位库的-dev,经常有冲突,强行安装会破坏64位环境,头文件并不像共享库分得那么完美。
我觉得比较好的做法是,重新把某一个文件夹当成rootfs,在里面安装各种32位的库和库-dev,然后给gcc传递参数"--sysroot=路径"就可以让gcc重新选取那个文件夹为rootfs,而不再认为/为rootfs。
先去Cygwin网站(>
接下来点击“下一步”,然后从一系列服务器列表中选择一个你认为网速最快的一个作为下载服务器。接着点击“下一步”就会出现如下图所示的界面,用来选择你想安装的程序。
GCC 就是 MinGW 的核心所在,GCC 是一套支持众多计算机程序语言的编译系统,而且在语言标准的实现上是最接近于标准的。并且 GCC
GCC 本身不像 VC 那样拥有IDE 界面(在 Windows 上也存在 Dev C++ 之类的支持 MinGW 编译器的
IDE)。源代码编辑你可以选用任何你喜欢的文本编辑器(据说微软的开发人员包括 VC 的开发都不用 VC 所带的 IDE 编辑器,而是选用 GNU
的 VIM 编辑器)。然后使用 make 等工具来进行软件项目的编译、链接、打包乃至发布。而像 cvs(svn)
源代码版本控制工具可以让世界上任何一个角落的人都可以参与到软件项目中来。
1、下载MinGW
一种方法是到Sourceforge(>
但是我配置的时候我电脑上安装了codeblocks,已经自带了MinGW。
2、环境变量的配置
在(系统属性-->高级-->环境变量-->系统变量 中)(以下目录都根据自己的电脑MinGW所在位置不同而改变)
a在PATH的值中加入“C:\Program Files\MinGWStudio\MinGW\bin”。这是寻找gcc编译器的路径。如果PATH中还有其他内容,需要用英文状态下分号进行分割
b新建LIBRARY_PATH变量,在其值中加入“C:\Program Files\MinGWStudio\MinGW\lib”。这是标准库存放的路径。
c新建C_INCLUDE_PATH变量,在其值中加入“C:\Program Files\MinGWStudio\MinGW\include”。这是Include查找头文件的路径。
3、验证gcc是否正常运行
在cmd控制台窗口下面,输入gcc -v。若已经成功安装好,会显示gcc的版本信息。
比如我们用gcc 930编译程序,但需要发布的机器gcc版本是485,怎么办?
你可能想到如下方法
将libc和libstdc++静态编译,编译时带上如下参数。
glibc并不推荐静态链接,你依赖的其他库可能依赖的了glibc,并且往往是动态链接的,可以通过 nm <bin> | grep GLIBC_ 确定你的程序是否依赖了glibc。
使用携带gcc930环境的容器发布程序,是可以的。但是在一些没有容器且没有sudo权限的场合,依然不太友好。
这个方法虽然听起来不是很优雅,但其实如果你对elf文件有一些了解,是不错的方式。下面说下具体的方法。
当你有条件获得程序源码,并能够重新编译时,可以直接在编译时指定相关参数来解决。
先说编译时要增加的参数:
gcc参数
ld参数
这两个参数分别设置的elf文件中的rpath和interpreter字段。
rpath
全名 run-time search path ,是elf文件中一个字段,它指定了可执行文件执行时搜索so文件的第一优先位置,一般编译器默认将该字段设为空。elf文件中还有一个类似的字段runpath,其作用与rpath类似,但搜索优先级稍低。搜索优先级:
如果你需要使用相对路径指定lib文件夹,可以使用 ORIGIN 变量,ld会将ORIGIN理解成可执行文件所在的路径。
interpreter
动态库加载器,程序启动时, *** 作系统会先把控制权转交给ld-linux-x86-64so2,该so负责加载所有程序依赖的so。。这个字段在链接时会帮你自动设置,64bit程序一般为 /lib64/ld-linux-x86-64so2 。修改rpath或者LD_LIBRARY_PATH指向本地lib目录,但通过ldd程序,发现/lib64/ld-linux-x86-64so2这个so仍然指向系统so。原因就是这个字段是写死在elf文件中的,并不受LD_LIBRARY_PATH影响。
编译时带上这两个参数,下面只需要将你程序依赖的so打包一份,随程序进行发布即可。
当你无法编译程序时,也可以通过其他方式修改rpath和interpreter。这种情况需要使用到一个工具 patchelf ,通过 dnf install patchelf 即可安装。你可以通过它修改elf文件的rpath和interpreter:
除了绝对路径,一种比较常见的方式是在部署前,使用 pwd 获取当前路径,使用相对路径指向本地lib。
首先,原来的原因主要是政治 - 谁添加的人矮基于平仓( eh_frame ),希望它是一个功能,总是有那么它可以用于实现各种不仅仅是C ++异常,包括其他的东西:
回溯()
__属性__((__ __清理(F)))
__ builtin_return_address(N)为 N'大于0
pthread_cleanup_push ,在__属性来实现的__((__清理__(F)))
然而,如果你不需要任何这些东西, eh_frame 是一样的东西增加的text 大小没有任何好处。你可以用 -fno异步退绕桌单独翻译单位禁止代 eh_frame ,而这主要是消除了大小开销,虽然你仍然有一些遗留下来 crtbegino 来,等你的无法的使用<$ C带他们$ C>条命令后;因为 eh_frame 是住在程序加载的一部分(这是整点)的部分,剥离它会修改在运行时打破它的方式二进制文件。见<一href=\">
以上就是关于“linux”怎么编译c的源程序的“gcc”编译命令是什么全部的内容,包括:“linux”怎么编译c的源程序的“gcc”编译命令是什么、64位linux下的GCC如何编译出一个32位可执行程序、如何在Windows平台下使用GCC编译器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)