Linux下交叉編譯出的so庫依賴libstdc++.so.6的問題?


對文件名 libfuck.so.4.0.1,我們知道:

1. 這個庫和 fuck 有關,也許是婦fu產c科k醫療系統的部分。

2. 庫的版本似乎是 4.0.1。

一般有這樣的軟鏈接指向這個文件:

libfuck.so.4:「指定大版本的話 就差不多沒問題了吧」(大版本號內部應是新的向下兼容舊的的,大版本號向上跳之後就不一定向下兼容不同大版本號了)[a]

libfuck.so:「版本什麼的 才不管呢」

這有什麼用呢?

假設你有很多版本,你目前是 libfuck4.0.1,同時安裝了 libfuck 3.4.7, 2.5.1, 2.4.4 等等。

libfuck.so -&> libfuck.so.4

libfuck.so.4 -&> libfuck.so.4.0.1

libfuck.so.3 -&> libfuck.so.3.4.7

libfuck.so.2 -&> libfuck.so.2.5.1(就是喜新厭舊你咬我啊)

於是你切換起來就看上去很方便了,共存起來也不出什麼問題,這種名字也就這個用。

libstdc++ 同理。(說回來倒不是所有人都是這麼放鏈接的)

最後提供一個高度骯髒但時常有效的解決方案:

sed -i.orig -e "s/libstdc++.so.6/libstdc++.so/g" /PATH/TO/ELF/BINARY

當然比較好的自然是文件鏈接但是我也不知道是不是每個部署目標都有。

最後你缺的不是 C 經驗也不是 C++ 經驗就是平常人不夠閑不會在各種目錄裡面瞎轉。

## REFS NOTES

a. 對 soname major.minor.patch,一般第一個為大版本號,此後依次為小版本號和補丁版本。大版本號內部各小版本號應保證 ABI 向較低但同大版本號的庫兼容,小版本號內部基本上不引入什麼新特性,以各種補丁為主。


建一個libstdc++.so.6鏈接指向libstdc++.so唄。你的makefile可能有點問題?


翻到了就回答一下吧,anroid不支持版本號結尾的soname,把soname改成非版本號結尾的吧,修改一下你的configure腳本吧,其它不清楚的學習autotools吧


推薦閱讀:

如何評價Zealer安卓版客戶端?
Github 上有哪些值得學習的 gradle 開源插件?
關於豌豆莢(類似應用)和國內第三方 Android 應用商店的思考,不知道是否正確?
小白求問!安卓root之後都能幹嘛!?

TAG:Android開發 | Linux開發 | 動態鏈接庫 | GLIBC | AndroidNDK |