c++ - linux如何把一个二进制可执行文件依赖的库找出来并编译成另一个可执行文件呢?
高洛峰
高洛峰 2017-04-17 15:17:02
0
3
741

这样把文件拷贝到其他地方就可以使用了

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(3)
大家讲道理

首先,你需要知道依賴哪些函式庫,ldd可以幫到你,不過不要高興的太早,有些程式採用動態載入庫,這些動態載入的函式庫是否依賴其他的函式庫就無法通過ldd這個靜態化分析工具知道了,你需要找到這些動態載入函式庫,並且重複呼叫ldd

不過知道了依賴並不解決你的問題,我想你是希望能夠編譯出一個沒有依賴的可執行文件,直接放到其他機器上運行。這需要用静态链接的方式,重新編譯程式原始碼才行,同時,依賴函式庫也需要提供archive版本的函式庫(通常是.a),而不是.so。很多依賴函式庫在安裝的時候是預設不安裝.a版本的函式庫的,甚至,有些函式庫即使你採用原始碼編譯,也無法預設編譯出archive版本的函式庫。

補充一點:如果你試圖將glibc靜態編譯進可執行檔的話,請盡量不要這麼做。 glibc是幾乎所有linux發行版系統都帶的基礎庫,一般不需要靜態鏈接進程序,而且glibc能做到向下兼容,所以只需在相對低版本的glibc下編譯,即可讓程序在linux系統之間具有更好的可移植性。如果你使用C++,那麼stdlib可能是你也要考慮的問題。試圖靜態化glibc會引發一些莫名其妙的問題。

大家讲道理

linux下ldd指令查看可執行程式所依賴的函式庫

ldd 可执行文件名
大家讲道理

動態函式庫你只能打包過去,編譯是需要原始碼加上連結的時候使用靜態連結才行的。 。
打包的時候還要注意底層庫(例如glibc)的版本,相同的機器環境的話就沒啥問題了,還有就是運行的時候要手動設定LD_LIBRARY_PATH來啟動你的程式。 。
同樓上+樓上的樓上 ldd可以查看elf程式使用的動態庫連結的指向。 。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板