一、编译可执行文件

g++ –c Hello.cpp  编译文件,生成目标文件Hello.o

g++ Hello.o –o a.out  链接并重命名为可执行文件a.out

g++ Hello.cc    编译链接一起,生成a.out

g++ Hello.cc –o hello 生成a.out并命名为hello

二、编译相关选项

(1)-c

生成.o文件,对代码文件进行预处理、编译和汇编,相当于windows下生成目标文件obj

g++ -c hello.cpp

(2)-I DirPath

指定文件查找目录

-include file

-i file

指定包含的文件

g++ hello.cpp -include ../include/a.h

-I- DirPath

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

(3)-L LibPath

指定链接库的路径

-l library

-llibrary

指定链接库

(4)  -g   
在编译的时候,产生调试信息,程序运行时可以dbg调试

(4)-static

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

优点:程序运行不依赖于其他库

缺点:文件比较大

gcc test_main.c -static -o test_main -lpthread

会发现test_main很大,它已经把各种依赖的东西都包含进来

(5) -shared (-G)

此选项将尽量使用动态库,为默认选项

优点:生成文件比较小

缺点:运行时需要系统提供动态库

(6)-Wall

一般使用该选项,允许发出GCC能够提供的所有有用的警告。也可以用-W{warning}来标记指定的警告。

三、静态库和动态库的编译命令

1、生成动态库和静态库

(1)得到hello.o

g++ -c hello.cpp

(2)得到静态库myhello.a

ar -cr libmyhello.a hello.o

(3)使用静态库

g++ -o hello main.c -L. -lmyhello

-L.表示静态库位于当前目录下,myhello自动加上lib组成静态库名称libmyhello.a

(4)得到动态库myhello.so

g++ -fPIC -shared hello.cpp -o libmyhello.so

(5)使用动态库

动态库的时候和静态库使用一样,唯一值得注意的是当目录中同时存在相同名称的动态库和静态库时,编译的时候优先使用动态库

2、fPIC选项

加上fPIC选项生成的动态库时位置无关的,可以实现多个进程共享动态库,多个进程引用同一个PIC动态库时,可以共享内存。这一个库在不同进程中的虚拟地址不同,但操作系统显然会把它们映射到同一块物理内存上。

不加fPIC,则加载so文件时,需要对代码段引用的数据对象需要重定位,重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于这个.so文件代码段和数据段内存映射的位置。可见,这种方式更消耗内存。

3、如何解决运行时找不到动态库的问题

(1)将动态库添加到系统默认的搜索路径下,如/lib、/usr/lib

(2)设置临时动态库路径的环境变量,这种方法设置的是临时的,系统重启之后就没了

export LD_LIBRARY_PATH=./

取消设置

export LD_LIBRARY_PATH=

(3)/etc/ld.so.cache中缓存了动态库路径,可以通过修改配置文件/etc/ld.so.conf中指定的动态库搜索路径,然后执行ldconfig命令来改变

(4)编译链接添加-WL,-rpath命令选项,将运行时动态库的搜索路径记录在可执行程序中

例如,有源文件test.cpp和func.cpp

g++ -shared -fPIC func.cpp -o libfunc.so

编译得到libfunc.so动态库

g++ main.cpp -o a.out -L ./ -lfunc

编译得到a.out,执行a.out,提示出错

ldd查看a.out依赖的动态库,发现libfunc.so找不到

g++ main.cpp -o a.out -L ./ -lfunc -WL,-rpath ./

编译得到a.out,执行a.out,运行成功,ldd查看a.out依赖的动态库,发现libfunc.so路径正确

把a.out和libfunc.so拷贝到任何目录下,都能运行成功

linux编译相关命令的更多相关文章

  1. Linux文件管理相关命令

    Linux文件管理相关命令   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux文件管理背景知识之后, 我们可以 ...

  2. Linux进程相关命令使用场景

    Linux进程相关命令使用场景 在Linux系统上工作时,我们常常会碰到很多和进程相关的查询场景,今天在这里进行详细的讲解,进程相关的对象包括以下几个: 端口:Port 进程号:PId 执行文件所在路 ...

  3. Linux 网络相关命令 Cheat Sheet

    以下漫画形式呈现的常用 Linux 网络相关命令速查表来自 twitter -

  4. Linux性能相关命令

    Linux性能相关命令 目录 Linux性能相关命令 1. 查看硬盘相关信息 2. 查看CPU相关信息 3. 查看内存相关信息 4. 查看进程运行的信息 1. 查看硬盘相关信息 cat /proc/s ...

  5. Linux解压缩相关命令

    Linux解压缩相关命令 运行级别: 0:关机 1:单用户 2:多用户无网络连接 3:多用户有网络连接 4:系统保留 5:图形界面 6:系统重启 通过init[0123456]来切换不同的运行级别 g ...

  6. Linux 文本相关命令(1)

    Linux 文本相关命令(1) 前言 最近线上环境(Windows Server)出现了一些问题,需要分析一下日志.感觉 Windows 下缺少了一些 Linux 系统中的小工具,像在这波操作中用到的 ...

  7. Linux文本相关命令

    Linux文本相关命令 目录 Linux文本相关命令 文本排序命令 文本去重命令 基础命令cut 文本三剑客 sed awk grep 文本排序命令 sort 常用参数: -n:以数值大小进行排序 - ...

  8. linux内核模块相关命令:lsmod,depmod,modprobe,modinfo,insmod,rmmod 使用说明

    加载内核驱动的通常流程: 1.先将.ko文件拷贝到/lib/module/`uname -r`(内核版本号)/kernel/driver/...目录下, 根据具体用途的区别分为net.ide.scsi ...

  9. linux:相关命令以及笔记

    首先,在linux 或者 unix里没有任何的反馈就叫成功,例如: (1)命令执行成功的样子:返回了登录用户信息 (2)命令执行失败的样子:没有返回任何东西 1.按键出现状况 解决:可以使用ctrl+ ...

随机推荐

  1. linux查看目录下各个文件大小的命令

    linux查看目录下各个文件大小的命令 由于需要经常查看各个文件的具体大小 ,所以这里记一下. 命令如下: du -h --max-depth=1

  2. vue.js实战——props数据验证(自定义构造器检测)

    Vue.component('my-component',{ props:{ //必须是数字类型 propA:Number, //必须是字符串或数字类型 propB:[String,Number], ...

  3. P2447 [SDOI2010]外星千足虫 (高斯消元)

    题目 P2447 [SDOI2010]外星千足虫 解析 sol写到自闭,用文字描述描述了半个小时没描述出来,果然还是要好好学语文 用高斯消元求解异或方程组. 因为 \(奇数\bigoplus奇数=偶数 ...

  4. http验证

    read -p "输入要添加的用户名: " USERNAME read -p "输入密码: " PASSWD printf "$USERNAME:$( ...

  5. jmeter笔记(8)--关联

    关联是jmeter中比较重要的一个点,在测试过程中有些数据是经常发生变化的,要获取这些数据,就需要使用关联,Jmeter可以通过“后置处理器”中的“正则表达式提取器”来处理关联.. 正则表达式提取器 ...

  6. Tomcat 配置文件 server.xml

    Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛.server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的一个组 ...

  7. Javascript介绍(了解)

    Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) JavaScript的历史 1992 ...

  8. SaltStack 介绍和安装

    SaltStack 介绍和安装 SaltStack 介绍 SaltStack是一种利用Python语言开发的,用于批量管理主机的一套工具,主要实现三种功能: 远程执行:通过saltstack工具,可以 ...

  9. ajax+json

    ajax学习: 1.ajax的概念 局部刷新技术.不是一门新技术,是多种技术的组合,是浏览器端的技术 2 为什么要使用ajax?           传统的模式 是 发送请求 到 服务器 ,服务器经过 ...

  10. palacehoder的自定义样式【输入框input /文本域textarea】

    7.palacehoder的自定义样式[输入框input /文本域textarea] 因为每个浏览器的CSS选择器都有所差异,所以需要针对每个浏览器做单独的设定(可以在冒号前面写input和texta ...