gcc编译选项

(1)fpic 和 fPIC 区别

在64位下编译动态库的时候,经常会遇到下面的错误

/usr/bin/ld: /tmp/ccQ1dkqh.o: relocation R_X86_64_32 against `a local symbol‘ can not be used when making a shared object; recompile with -fPIC

Use -fPIC or -fpic to generate code. Whether to use -fPIC or -fpic to generate code is target-dependent. The -fPIC choice always works, but may produce larger code than -fpic (mnenomic to remember this is that PIC is in a larger case, so it may produce larger amounts of code). Using -fpic option usually generates smaller and faster code, but will have platform-dependent limitations, such as the number of globally visible symbols or the size of the code. The linker will tell you whether it fits when you create the shared library. When in doubt, I choose -fPIC, because it always works.

-fPIC: 总是能够工作,但可能产生的代码较大

-fpic: 通常能产生更快更小的代码,但有平台限制。

(2)编译选项 -static 的作用

(3)-march 指定目标架构选项

-march选项就是就是指定目标架构的名字,gcc就会生成针对目标架构优化的目标代码,如-march=prescott会生成针对i5或i7的目标码,从而充分发挥cpu的性能。

自gcc4.2,引入了 -march=native ,从而允许编译器自动探测目标架构并生成 针对目标架构优化的目标代码 ,这比手工设置要安全的多。

通过下面的命令查询当前机器的架构名称,比如:

#gcc -march=native -Q --help=target | grep march

-march=                     haswell

有的时候编译会报 "no such instruction", (没有这个机器指令)

解决的方案:

1.makefile 中删掉 -march=native

2.找到正确的目标框架名称设置

时间: 2024-10-29 19:06:26

gcc编译选项的相关文章

[小技巧] gcc 编译选项-###

原文译至:http://elinux.org/GCC_Tips 的一小部分. -###编译选项用于查看编译的过程 gcc -### <你的命令行的其他部分放在这里> 你运行的GCC其是一系列工具的集合.通过这个参数,gcc能生成(但并不执行)一系列的命令用于完成你输入的任务.你可以看到在gcc编译下面的细节,什么库会被使用?-mcpu设成什么值?都在输出的结果中. 你可以将输出定向到一个文件并执行这个文件里的命令来编译程序,这样你可以更好地了解gcc是如何调用汇编器和链接器的. Reading

GCC 编译选项

http://www.cnblogs.com/xmphoenix/archive/2011/03/21/1989944.html GCC 编译选项(转) gcc提供了大量的警告选项,对代码中可能存在的问题提出警 告,通常可以使用-Wall来开启以下警告:            -Waddress -Warray-bounds (only with -O2) -Wc++0x-compat            -Wchar-subscripts -Wimplicit-int -Wimplicit-

2015-08-26: GCC编译选项(转载)

gcc提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告:           -Waddress -Warray-bounds (only with -O2) -Wc++0x-compat           -Wchar-subscripts -Wimplicit-int -Wimplicit-function-declaration           -Wcomment -Wformat -Wmain (only for C/ObjC and un

GCC编译选项 -OX[转]

作者:知乎用户链接:https://www.zhihu.com/question/27090458/answer/137944410来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一般来说,如果不指定优化标识的话,gcc就会产生可调试代码,每条指令之间将是独立的:可以在指令之间设置断点,使用gdb中的 p命令查看变量的值,改变变量的值等.并且把获取最快的编译速度作为它的目标. 当优化标识被启用之后,gcc编译器将会试图改变程序的结构(当然会在保证变换之后的程序与源

【转】Eclipse+CDT+Gcc编译选项控制

原文地址:http://www.oschina.net/question/4873_19441 如果我们的程序调用动态链接库,当在cdt中运行的时候,可以通过run-->enviroment-->添加LD_LIBRARY_PATH 环境变量来设置查找动态链接库文件的路径.但是在运行的时候,程序去那里找动态链接库呢? 方法主要有两种.一种,是设置系统的LD_LIBRARY_PATH 环境变量(在eclipse里设置对外部正式运行的程序无效).设置的方法见附录资料三 另外一种,是将动态链接库文件的

1 C语言 gcc 介绍 C 语言编译 main接受参数

1         第一个c语言的hello world 1.1      include头文件包含 头文件包含,写法#include<文件名>, 1.2      main函数 这个就是C语言程序的入口,所有的C程序都是从main开始执行,一个C的源程序必须有一个main函数,也只能有一个main函数 1.3      注释 //注释一行 /* */代表块注释,可以注释多行代码 1.4      {}括号和代码块 代表一个代码单元 1.5      声明 C语言规定,所有的变量和函数必须先声

0-15 GCC程序编译

用法:    gcc [...] filenames 例如:    gcc hello.c 输出:    a.out 过程:    hello.c 预变异 hello.i 编译后 hello.s 汇编后 hello.o 链接后 hello 预编译:         gcc -E hello.c -o hello.i 编译  :         gcc -S hello.i -o hello.s 汇编  :         gcc -C hello.s -o hello.o 链接  :      

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同

Linux下gcc与gdb简介

gcc编译器可以将C.C++等语言源程序.汇编程序编译.链接成可执行程序.gdb是 GNU 开发的一个Unix/Linux下强大的程序调试工具. linux下没有后缀名的概念.但 gcc 根据文件的后缀来区别输入文件的类别: .c C语言源代码文件.a 由目标文件构成的库文件.C..cc..cpp  C++源码文件.h 头文件.i 经过预处理之后的 C 语言文件.ii 经过预处理之后的 C++ 文件.o 编译后的目标文件.s 汇编源码文件.S 经过预编译的汇编源码文件 程序由C.C++源代码到可