经典!GCC常用的操作选项

gcc
简单讲解和常用参数解析

.a 
静态库 (archive)  

.c 
C源代码(需要编译预处理)  

.h 
C源代码头文件    

.i 
C源代码(不需编译预处理)

.o 
对象文件       

.s 
汇编语言代码

.so
动态库

$gcc
-g -Wall hello.c -o hello 

-Wall  
开启编译器几乎所有常用的警告

-g 
表示在生成的目标文件中带调试信息 

-o 
后面为指定生产的机器码的文件名

$
gcc -Wall hello.c hello_fn.c -o newhello 

编译多个源文件,且在同一目录

$
gcc -Wall calc.c /usr/lib/libm.a -o calc 

/usr/lib/libm.a
静态库的位置,及库名;也可写成下面格式

$
gcc -Wall calc.c -lm -o calc

-lm
等价  /usr/lib/libm.a 或 搜索路径 libm.so libm.a

-lNAME 
等价搜索路径的 libNAME.a 或 libNAME.so

$
gcc -E hellou.c -o hellou.i  

-E 
指示编译器只进行编译预处理

$
gcc -S hellou.c      

-S 
指示编译器生成汇编语言代码然后结束

$
gcc -c -Wall first.c second.c    

-c 
只生成 .o 的对象文件

$
ar -r libhello.a first.o second.o

-r 
可以创建一个新库并将对象文件插入

$
gcc -c -Wall -fpic sh1.c sh2.c   

-fpic  
使生成的对象模块采用浮动的(可重定位的)地址。

pic
代表“位置无关代码”(position independent code)。

$
gcc -Wall -shared sh1.o sh1.o -o Esh.so  

-shared
指定生成动态连接库,linux专有

$
gcc -Wall -fpic -shared sh1.c sh1.c -o Esh.so

头文件默认路径:/usr/local/include/
和 /usr/include/

库文件默认路径:/usr/local/lib/
和 /usr/lib/

-Ldir  
添加动态、静态库的搜索路径(dir),非系统默认库必须在命令中指出库名

-Idir  
添加头文件的搜索路径(dir),头文件无需在命令中指出,头文件可以任意移动!(详解查预编译)

(链接库,一:-Ldir 
libNAME.so 或 libNAME.a;二:dir/libNAME.so 或 dir/libNAME.a)

-I-
就是取消前一个参数的功能,所以一般在-Idir之后使用

-static
此选项将禁止使用动态库。

$gcc
-g -Wall -I/usr/local/include/python2.5/ /home/afa/lib/python2.5.so EmbedFunc.c -shared -o EmbedFunc.so

$gcc
thread.c -o thread -lpthread  

libpthread.a不是
Linux 系统默认的库,使用时需加库命。

BRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,

不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

注意  调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录通过 “-I” include进来了,

库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,

这时你要作的就是通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib

export BRARY_PATH=$LD_LIBRARY_PATH:./lib

通常这样做就可以解决库无法链接的问题了。

时间: 2024-11-01 17:53:58

经典!GCC常用的操作选项的相关文章

嵌入式Linux GCC常用命令

本文和大家分享的主要是嵌入式Linux GCC常用命令相关内容,一起来看看吧,希望对大家学习嵌入式Linux有所帮助. 1.简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective C 语言.Pascal 语言.COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等.而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 

常用的操作正则表达式的方法+正则表达式基本元字符使用实例

常用的操作正则表达式的方法: 下面学习一下位于System.Text.RegularExpressions下的Regex类的一些静态方法和委托(只要有一段匹配就会返回true) 1,静态方法IsMatch (返回值是一个布尔类型,用于判断指定的字符串是否与正则表达式字符串匹配,它有三个重载方法) bool IsMatch(string input, string pattern); 参数: input: 要搜索匹配项的字符串. pattern: 要匹配的正则表达式模式. 返回结果: 如果正则表达

【vim】插入模式与常用编辑操作

vim不像很多编辑器那样一启动便可以直接编辑文本,需要在普通模式按下i, a等键才会进入插入模式进行文本编辑. 如何进入插入模式 以下的命令都会让vim从普通模式切换到插入模式,但命令执行后的字符插入位置有所不同. 命令 执行后的字符插入位置 i  当前字符之前 I  当前行首第一个非空白字符之前  a  当前字符之后 A  当前行尾 s  删除当前字符,光标停留在下一个字符处 S  删除当前行,光标停留在行首 o  在当前行的下方插入一个新行,光标停在新行行首 O  在当前行的上方插入一个新行

GCC常用参数

GCC--GNU C Compiler c语言编译器(远不止c语言) 介绍: 作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作 GCC 的时候,还只是把它当作仅仅一个C 程序语言的编译器:GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言,C++ 语言,Java 语言,Objective C 语言,Pascal 语言,COBOL 语言,以及支持函数式编程和逻辑编程的 Merc

Git常用的操作指令

修改最后一次提交 有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了.想要撤消刚才的提交操作,可以使用--amend 选项重新提交: 1 $ git commit --amend -m"修改 提交 说明" 此命令将使用当前的暂存区域快照提交.如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会 重新编辑提交说明,但将要提交的文件快照和之前的一样. 启动文本编辑器后,会看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交. 如果

java 常用Date操作

[java] view plain copy 获取年月日时分秒: [java] view plain copy package com.util; import java.text.DateFormat; import java.util.Calendar; import java.util.Date; public class Test { public void getTimeByDate(){ Date date = new Date(); DateFormat df1 = DateFor

linux常用命令和选项

相信使用过linux的朋友或多或少都有接触过linux的命令吧!linux的命令重多,而且每一个命令又有许多的选项,感觉非常难以记忆.其实只要掌握了一定的方法只后那么其实也是很easy的.下面就让我们来看看linux的常用命令和选项 ls:查看文件夹里面的内容 --help:显示帮助信息(基本所有命令都可以使用) -l:显示详细信息(ll就是ls -l的别名) -h:进行单位换算,通常和-l一起使用 -a:显示所有,包括隐藏文件 -R:递归显示(会查看各个子文件夹的内容) -S:根据文件大小排序

[0014] HDFS 常用JAVA 操作实战

目的: 学习用java进行的常用hdfs操作 参考: [0002] Hadoop HDFS cmd常用命令练手 环境: hadoop2.6.4 win7 下的eclipse环境调试已经配置好,参考前面的文章 代码: 1. 创建文件夹 1 package hdfs; 2 3 import java.io.IOException; 4 5 import org.apache.hadoop.conf.Configuration; 6 import org.apache.hadoop.fs.FileSy

Windows Server 2012 R2 WSUS-11:经典的客户端排错操作

在实际的WSUS运维中,可能会出现需要手动调整客户机或者服务器的情况,比如因为组策略的原因,或者刷新间隔未到,客户端(包括客户机和服务器)未收到更新,这个时候就需要我们在客户端上执行一些操作来定位问题,确认是什么原因导致补丁未收到. (一)刷新组策略并收集组策略结果集,以确保客户端获取到了WSUS相关的策略 首先我登陆一台客户端,打开CMD,输入组策略的刷新命令gpupdate /force,如图. 刷新成功后,我们使用gpresult /h gpreport.html来收集组策略结果,如图.