导航:首页 > 源码编译 > 编译需要不同版本的lib

编译需要不同版本的lib

发布时间:2024-01-17 21:21:23

① 高版本gcc编译出的程序在低版本glibc机器上运行

比如我们用gcc 9.3.0编译程序,但需要发布的机器gcc版本是4.8.5,怎么办?

你可能想到如下方法

将libc和libstdc++静态编译,编译时带上如下参数。

glibc并不推荐静态链接,你依赖的其他库可能依赖的了glibc,并且往往是动态链接的,可以通过 nm <bin> | grep GLIBC_ 确定你的程序是否依赖了glibc。

使用携带gcc9.3.0环境的容器发布程序,是可以的。但是在一些没有容器且没有sudo权限的场合,依然不太友好。

这个方法虽然听起来不是很优雅,但其实如果你对elf文件有一些了解,是不错的方式。下面说下具体的方法。

当你有条件获得程序源码,并能够重新编译时,可以直接在编译时指定相关参数来解决。
先说编译时要增加的参数:

gcc参数

ld参数

这两个参数分别设置的elf文件中的rpath和interpreter字段。

rpath
全名 run-time search path ,是elf文件中一个字段,它指定了可执行文件执行时搜索so文件的第一优先位置,一般编译器默认将该字段设为空。elf文件中还有一个类似的字段runpath,其作用与rpath类似,但搜索优先级稍低。搜索优先级:

如果你需要使用相对路径指定lib文件夹,可以使用 ORIGIN 变量,ld会将ORIGIN理解成可执行文件所在的路径。

interpreter
动态库加载器,程序启动时,操作系统会先把控制权转交给ld-linux-x86-64.so.2,该so负责加载所有程序依赖的so。。这个字段在链接时会帮你自动设置,64bit程序一般为 /lib64/ld-linux-x86-64.so.2 。修改rpath或者LD_LIBRARY_PATH指向本地lib目录,但通过ldd程序,发现/lib64/ld-linux-x86-64.so.2这个so仍然指向系统so。原因就是这个字段是写死在elf文件中的,并不受LD_LIBRARY_PATH影响。

编译时带上这两个参数,下面只需要将你程序依赖的so打包一份,随程序进行发布即可。

当你无法编译程序时,也可以通过其他方式修改rpath和interpreter。这种情况需要使用到一个工具 patchelf ,通过 dnf install patchelf 即可安装。你可以通过它修改elf文件的rpath和interpreter:

除了绝对路径,一种比较常见的方式是在部署前,使用 pwd 获取当前路径,使用相对路径指向本地lib。

② 怎样在visual studio opencv中编译

1、设置VC++目录,
可执行目录 C:\opencv\build\x86\vc10\bin
包含目录 C:\opencv\include;C:\opencv\build\include;C:\opencv\build\include\opencv2;C:\opencv\build\include\opencv
库目录 C:\opencv\build\x86\vc10\staticlib
2、链接器 输入 添加staticlib下的所有release版本lib
asmlibrary.lib
IlmImf.lib
libjasper.lib
libjpeg.lib
libpng.lib
libtiff.lib
zlib.lib
opencv_calib3d244.lib
opencv_contrib244.lib
opencv_core244.lib
opencv_features2d244.lib
opencv_flann244.lib
opencv_gpu244.lib
opencv_highgui244.lib
opencv_imgproc244.lib
opencv_legacy244.lib
opencv_ml244.lib
opencv_nonfree244.lib
opencv_objdetect244.lib
opencv_photo244.lib
opencv_stitching244.lib
opencv_ts244.lib
opencv_video244.lib
opencv_videostab244.lib
二、去掉重复引入
常规 在静态库中使用 MFC
C/C++ 代码生成 使用MT
三、找不到AVIInputFile符合
C盘搜索VFW32.lib,添加到项目

③ lib文件是什么是不是编译自动生成我不加lib文件运行不了

lib文件是静态库,这种文件中有头文件中声明的函数的实现代码,一般用在静态连编上,编译链接时,将lib文件与其他模块编译生成的目标代码链接,从而形成能够运行的可执行文件。
#pragma comment(lib, "pcc32_vc6.lib")就是连入一个库文件,表示链接pcc32_vc6.lib这个静态库文件来生成可执行文件。

④ 编译安装python需要哪些依赖

依赖库:

//使用apt 安装即可
1.gcc, make, zlib1g-dev(压缩解压缩库)
安装过程需要的库。
2.libbz2-dev
bz2支持库,若在编译安装python前没有安装,将无法通过pip install 安装提供bz2格式的第三方库,会出现unsupported archive format: .tar.bz2的错误,例如爬虫库Scrapy依赖的Twisted。
3.libsqlite3-dev
sqlite3支持库,若在编译安装python前没有安装,则python中会缺失sqlite3模块,当引入sqlite3或使用依赖sqllite3的第三方库(例如Scrapy)时,会出现ImportError: No mol named _sqllite3的错误。
//以上为编译安装前需要安装的库,可能不够全面,会不断补充。
4.其他:安装第三方库需要的库
python3-dev, libxml2-dev, libxslt1, libffi-dev, libssl-dev等,在安装第三方库会有具体说明,不做过多解释。

安装:

//通过wget获取压缩包,这里选择3.6.1版
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
//解压
tar xJf Python-3.6.1.tar.xz
cd Python-3.6.1
./configure
make
/*这步如果需要sudo,请使用sudo -H命令,即sudo -H make install,避免pip等模块安装失败。
错误示例(pip安装失败):The directory '/home/ls/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
*/
make install

⑤ 关于gcc编译选项选取动态库不同版本的问题

不同版本的动态库是为了升级方便,旧的程序需要与旧的库链接,新的程序与新的.

一般的做法是把libabc.so连接(symbolic link, ln -s libabc.so.N libabc.so)到最新的版本,这样以后的新程序,在用gcc -labc的时候,都会链接到新的版本.旧的已经链接好的程序并不会产生不兼容的问题,因为旧程序在过去已经链接过了(动态库链接的信息可以用ldd来查看: ldd /bin/ls).

symbolic link, ln是推荐的维护版本的办法,不建议更改文件名.

如果你要有一个方便的办法链接旧的版本, 建一个旧的版本的symbolic link就可以了,libabc11.so
ln -s libabc.so.11 libabc11.so
gcc -labc11...

阅读全文

与编译需要不同版本的lib相关的资料

热点内容
建兴app怎么变成黑色了 浏览:49
文件压缩包如何加密文件 浏览:183
2010提出的算法 浏览:672
冰柜压缩机的寿命 浏览:105
办公室采访程序员 浏览:569
美橙云服务器购买 浏览:754
汉语词典pdf下载 浏览:353
android公网ip 浏览:613
要塞1地图放哪个文件夹 浏览:850
凡科建站怎么弄服务器 浏览:939
苹果手机怎么设置app播放 浏览:202
下载网站源码用什么浏览器 浏览:241
六线谱pdf 浏览:156
linuxmysqlsock 浏览:239
人教版数学pdf下载 浏览:460
文档安全加密系统 浏览:492
数控铣床编程简单数字 浏览:788
编程电缆如何重启 浏览:121
myqq命令行发消息 浏览:365
日产逍客怎么使用app升窗 浏览:503