linux程式執行不相容問題

2021-10-01 10:16:21 字數 1097 閱讀 8688

linux開發平台編譯的程式,部署到執行平台linux系統程式經常不能使用,大部分是由於glibc的版本存在差異導致的,為了解決glibc版本相容的問題,可以使用靜態鏈結的方式鏈結glibc相關的庫,但同時也會遇到需要鏈結部分so庫的情況。

預設情況下,gcc/g++使用的是動態鏈結,鏈結時,優先查詢待鏈結的so庫是否存在,如果存在,則鏈結so庫;如果不存在,則查詢.a是否存在,如果存在則鏈結.a庫;那麼,如何同時鏈結靜態庫和動態庫呢?幸好gcc/g++也提供了靜態鏈結和動態鏈結的選項,如下:

-wl,-bstatic  指示後面的鏈結使用靜態鏈結方式鏈結

-wl,-bdynamic  指示後面的鏈結使用動態鏈結方式鏈結

如:1、g++ test.cpp -la -lb    -o test優先鏈結liba.so和libb.so庫,如果不存在.so庫,則鏈結liba.a和libb.a庫,這是預設鏈結的方式

2、g++ test.cpp -wl,bstatic -la -lb -o test 只鏈結liba.a和libb.a庫,如果不存在則報錯

3、g++ test.cpp -wl,bdynamic -la -lb -o test 只鏈結liba.so和libb.so庫,如果不存在則報錯

4、g++ test.cpp -wl,bstatic -la -lb   -wl,bdynamic -lc -ld -le -o test -wl,bstatic之後的庫使用靜態鏈結的方式,而-wl,bdynamic之後的庫使用動態鏈結的方式。注意:-wl,bstatic選項要在-wl,bdynamic之前

安裝glibc時,預設只安裝了.so庫,沒有安裝.a庫,所以首先需要安裝glibc的.a庫:yum install glibc-static

其次,增加編譯選項:-lstdc++,如下:

g++ test.cpp -wl,bstatic -la -lb -lstdc++   -wl,bdynamic -lc -ld -le -o test

這樣完成編譯、鏈結以後,a、b、glibc庫是以靜態的方式鏈結到程式中,即使glibc的版本存在差異,也能正常執行程式;c、d、e等庫則以動態鏈勢頭的方式鏈結到程式中,執行時,so的版本必須要匹配。

針對於高版本的gcc/g++,提供了-static選項。

padding ie 不相容問題

通常我們遇到3種情況 ie6 正常 ie7 ff不正常 這種情況下我們這樣處理 padding 7px important 針對ff ie7 padding 6px 針對ie6 ie6 ie7正常 ff不正常 這種情況我們要這麼處理,因為 important ie7也是能識別的!www.cppcns...

Linux Mysql中文不相容問題

mysql使用新手,在linux中使用mysql時遇到中文相關的兩個問題 在命令列中無法輸入中文 insert 中文顯示亂碼以及無法插入的 作業系統 ubuntu 18.04 lts mysql 版本 5.7.32 遠端工具 xshell 7 驗證完成在terminal中可以輸入中文 使用mysql...

小程式相容問題

問題1 小程式ios端的margin bottom無效。解決辦法 用padding bottom替換。問題2 小程式ios端的日期為nan nan.原因 一般日期為 2020 08 08 08 08 08 格式,ios日期只支援 2020 08 08 08 08 08 解決辦法 運用正則轉為需要的i...