linux编译相关命令
一、编译可执行文件
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编译相关命令的更多相关文章
- Linux文件管理相关命令
Linux文件管理相关命令 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux文件管理背景知识之后, 我们可以 ...
- Linux进程相关命令使用场景
Linux进程相关命令使用场景 在Linux系统上工作时,我们常常会碰到很多和进程相关的查询场景,今天在这里进行详细的讲解,进程相关的对象包括以下几个: 端口:Port 进程号:PId 执行文件所在路 ...
- Linux 网络相关命令 Cheat Sheet
以下漫画形式呈现的常用 Linux 网络相关命令速查表来自 twitter -
- Linux性能相关命令
Linux性能相关命令 目录 Linux性能相关命令 1. 查看硬盘相关信息 2. 查看CPU相关信息 3. 查看内存相关信息 4. 查看进程运行的信息 1. 查看硬盘相关信息 cat /proc/s ...
- Linux解压缩相关命令
Linux解压缩相关命令 运行级别: 0:关机 1:单用户 2:多用户无网络连接 3:多用户有网络连接 4:系统保留 5:图形界面 6:系统重启 通过init[0123456]来切换不同的运行级别 g ...
- Linux 文本相关命令(1)
Linux 文本相关命令(1) 前言 最近线上环境(Windows Server)出现了一些问题,需要分析一下日志.感觉 Windows 下缺少了一些 Linux 系统中的小工具,像在这波操作中用到的 ...
- Linux文本相关命令
Linux文本相关命令 目录 Linux文本相关命令 文本排序命令 文本去重命令 基础命令cut 文本三剑客 sed awk grep 文本排序命令 sort 常用参数: -n:以数值大小进行排序 - ...
- linux内核模块相关命令:lsmod,depmod,modprobe,modinfo,insmod,rmmod 使用说明
加载内核驱动的通常流程: 1.先将.ko文件拷贝到/lib/module/`uname -r`(内核版本号)/kernel/driver/...目录下, 根据具体用途的区别分为net.ide.scsi ...
- linux:相关命令以及笔记
首先,在linux 或者 unix里没有任何的反馈就叫成功,例如: (1)命令执行成功的样子:返回了登录用户信息 (2)命令执行失败的样子:没有返回任何东西 1.按键出现状况 解决:可以使用ctrl+ ...
随机推荐
- 开发过程中,ps要做的事情
修改图片的分片率 把背景改为透明的 把一个图片的颜色要一下
- python nympy 序列化dict
首先定义dict dict={} 对象写到dict dict['key']=object 存储dict np.save('dictname.npy',dict) 读取dict dictname=np. ...
- Java内存溢出和内存泄露后怎么解决
1.首先这里先说一下内存溢出和内存泄露的区别: 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但 ...
- iOS 使用百度的人脸识别登录验证,解决认证失败不跳转界面连续认证,认证相似度对比
在使用百度人脸识别出现的问题:小米6调用摄像机是黑白的一个情况,iOS上会出现识别准确性上的问题(多次代开认证,会通过) 人脸识别(活体验证): 1.芝麻认证 : 0.4元/次,需要企业企业认证.不能 ...
- Java PDF转图片
maven依赖: <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbo ...
- BZOJ2339[HNOI2011]卡农——递推+组合数
题目链接: [HNOI2011]卡农 题目要求从$S=\{1,2,3……n\}$中选出$m$个子集满足以下三个条件: 1.不能选空集 2.不能选相同的两个子集 3.每种元素出现次数必须为偶数次 我们考 ...
- JQ高级
一.选择器 css语法选择器 $('css3 选择器位‘) 索引匹配 $('div:eq(0)') $('div').eq(0) 内容 $('div:contains(标签文本内容)') // 注:采 ...
- [POI2015]KIN[线段树]
很套路的维护最大和子段 #include <cmath> #include <cstring> #include <cstdio> #include <cst ...
- H3C WAP712C 路由器设置
0.做完任何设置之后都要执行保存操作,否则断电后设置会丢失! 1.默认登录参数:IP:192.168.0.50ID:adminPD:h3capadmin 2.修改默认IP地址:设备 --> 接口 ...
- Gitlab安装简明文档
1.关于Gitlab CE / GitLab EE版本的区别:Gitlab CE(Community Edition):Gitlab社区版,可以免费试用,无官方支持.GitLab EE(Enterpr ...