linux编译相关命令

1、编译可执行文件windows

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

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

g++ Hello.cc    编译连接一块儿,生成a.out操作系统

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

2、编译相关选项对象

(1)-cblog

生成.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}来标记指定的警告。

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

一、生成动态库和静态库

(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)使用动态库

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

二、fPIC选项

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

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

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

(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拷贝到任何目录下,都能运行成功

相关文章
相关标签/搜索