这样把文件拷贝到其他地方就可以使用了
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
首先,你需要知道依賴哪些函式庫,ldd可以幫到你,不過不要高興的太早,有些程式採用動態載入庫,這些動態載入的函式庫是否依賴其他的函式庫就無法通過ldd這個靜態化分析工具知道了,你需要找到這些動態載入函式庫,並且重複呼叫ldd。
ldd
不過知道了依賴並不解決你的問題,我想你是希望能夠編譯出一個沒有依賴的可執行文件,直接放到其他機器上運行。這需要用静态链接的方式,重新編譯程式原始碼才行,同時,依賴函式庫也需要提供archive版本的函式庫(通常是.a),而不是.so。很多依賴函式庫在安裝的時候是預設不安裝.a版本的函式庫的,甚至,有些函式庫即使你採用原始碼編譯,也無法預設編譯出archive版本的函式庫。
静态链接
.a
.so
補充一點:如果你試圖將glibc靜態編譯進可執行檔的話,請盡量不要這麼做。 glibc是幾乎所有linux發行版系統都帶的基礎庫,一般不需要靜態鏈接進程序,而且glibc能做到向下兼容,所以只需在相對低版本的glibc下編譯,即可讓程序在linux系統之間具有更好的可移植性。如果你使用C++,那麼stdlib可能是你也要考慮的問題。試圖靜態化glibc會引發一些莫名其妙的問題。
linux下ldd指令查看可執行程式所依賴的函式庫
ldd 可执行文件名
動態函式庫你只能打包過去,編譯是需要原始碼加上連結的時候使用靜態連結才行的。 。 打包的時候還要注意底層庫(例如glibc)的版本,相同的機器環境的話就沒啥問題了,還有就是運行的時候要手動設定LD_LIBRARY_PATH來啟動你的程式。 。 同樓上+樓上的樓上 ldd可以查看elf程式使用的動態庫連結的指向。 。
glibc
LD_LIBRARY_PATH
elf
首先,你需要知道依賴哪些函式庫,
ldd
可以幫到你,不過不要高興的太早,有些程式採用動態載入庫,這些動態載入的函式庫是否依賴其他的函式庫就無法通過ldd
這個靜態化分析工具知道了,你需要找到這些動態載入函式庫,並且重複呼叫ldd
。不過知道了依賴並不解決你的問題,我想你是希望能夠編譯出一個沒有依賴的可執行文件,直接放到其他機器上運行。這需要用
静态链接
的方式,重新編譯程式原始碼才行,同時,依賴函式庫也需要提供archive版本的函式庫(通常是.a
),而不是.so
。很多依賴函式庫在安裝的時候是預設不安裝.a
版本的函式庫的,甚至,有些函式庫即使你採用原始碼編譯,也無法預設編譯出archive版本的函式庫。補充一點:如果你試圖將glibc靜態編譯進可執行檔的話,請盡量不要這麼做。 glibc是幾乎所有linux發行版系統都帶的基礎庫,一般不需要靜態鏈接進程序,而且glibc能做到向下兼容,所以只需在相對低版本的glibc下編譯,即可讓程序在linux系統之間具有更好的可移植性。如果你使用C++,那麼stdlib可能是你也要考慮的問題。試圖靜態化glibc會引發一些莫名其妙的問題。
linux下ldd指令查看可執行程式所依賴的函式庫
動態函式庫你只能打包過去,編譯是需要原始碼加上連結的時候使用靜態連結才行的。 。
打包的時候還要注意底層庫(例如
glibc
)的版本,相同的機器環境的話就沒啥問題了,還有就是運行的時候要手動設定LD_LIBRARY_PATH
來啟動你的程式。 。同樓上+樓上的樓上
ldd
可以查看elf
程式使用的動態庫連結的指向。 。