职位:技术总监 1、精通c++(linux平台、vc++Mfc、qt)、java、php、unity3d,略懂python 2、用c++开发过嵌入式产品,用c++开发过大型银行运维产品 3、用java开发大型银行运维产品,学校教务系统 4、用php开发进销存系统(在销售中),用php开发淘宝小程序 5、用unity3d开发衣柜设计软件,在运营中
分类: C/C++
2011-09-29 19:04:23
Linux/unix程序静态编译
一、前言
问题来源:做动态口令认证的时候,由于需要linux系统、aix、hpunix等系统都能加pam认证,这时候遇到一个问题,客户那每个系统的库都不一样,所有才想到了需要静态编译,不依赖客户系统上的库
因为程序要要安装在不同的操作系统上,在linux上每个操作系统都有不同的依赖库。要想让自己的程序在每种操作系统上都能运行,有两种方法。
1、做yum源,能解决所有依赖问题。
2、将程序弄成静态编译。
在unix上是没有yum源的,还有我想的是使用g++做统一的编译工具。所以静态编译时最好的解决方法。
二、可执行程序的静态编译
默认使用动态编译
使用动态编译:
三、动态库的静态编译
n 默认编译
可见使用了很多动态库,其中包括g++的动态库。
-shared参数是指生成动态库。
这个参数是在大部分linux、unix的选项
在solaris上,没有不使用-shared,生成动态库使用-G
n 使用静态库编译静态库:
可见此动态库不依赖于任何动态库。
参数讲解:
-Wl,-Bstatic是传个link的,让其找相应静态库连接。这个参数很有意思,它与-Wl,-Bdynamic能配合使用,从而达到指定哪个库使用动态库,哪个库使用静态库。
但是光使用这个参数,对于g++的库会有问题。报下面的错误
因为gcc_s是没有静态库的。
再加一个参数-static居然能解决问题。这个凑巧碰出来了,现在也不知道是为什么。
n Solaris、hp-unix
在这两个系统上只使用-static -Wl,-Bstatic,对gcc库会有问题,应再加上参数-static-libgcc
n 64位linux
64位的linux上,对于g++的库只能用动态库编译,静态编译始终会有gcc_s的错误