日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

linux很多程序都要本地编译,让C/C++程序一次编译可以发布到多版本Linux之上

發布時間:2025/3/15 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux很多程序都要本地编译,让C/C++程序一次编译可以发布到多版本Linux之上 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近頁游開放平臺比較多, 每個平臺要求的Linux版本各不相同, 這給開發人員部署服務器帶來了很大的困難. 在本機Linux編譯的程序,發布時即便將依賴的so附帶到目標Linux環境,仍然會碰到依賴及版本問題,例如:

[root@localhost bin]# ldd wkcenter

./wkcenter: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./wkcenter)

./wkcenter: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./wkcenter)

./wkcenter: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./wkcenter)

./wkcenter: /lib/libc.so.6: version `GLIBC_2.9' not found (required by ./wkcenter)

./wkcenter: /lib/libc.so.6: version `GLIBC_2.7' not found (required by ./wkcenter)

./wkcenter: /lib/libc.so.6: version `GLIBC_2.8' not found (required by ./wkcenter)

./wkcenter: /lib/libc.so.6: version `GLIBC_2.11' not found (required by ./wkcenter)

linux-gate.so.1 =>? (0xffffe000)

liblog4cpp.so.4 => not found

libprotobuf.so.7 => not found

libboost_filesystem.so.1.48.0 => not found

libboost_system.so.1.48.0 => not found

libboost_thread.so.1.48.0 => not found

libboost_program_options.so.1.48.0 => not found

libunwind-x86.so.7 => not found

libluabind.so.0.9.0 => not found

libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x008ae000)

libm.so.6 => /lib/libm.so.6 (0x0044b000)

libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00476000)

libc.so.6 => /lib/libc.so.6 (0x002c1000)

libpthread.so.0 => /lib/libpthread.so.0 (0x0041d000)

librt.so.1 => /lib/librt.so.1 (0x00440000)

/lib/ld-linux.so.2 (0x002a2000)

上面紅字部分表示glibc及glibcxx庫依賴不正確. 本人使用的Linux編譯版本為Mint 11(基于Ubuntu), 一般Ubuntu發行版的glibc配備非常高. 但是上文中的發布的Linux版本為CentOS 5.8

使用/lib/libc.so.6 查看libc版本為2.5, 遠遠低于開發環境的2.11

GNU C Library stable release version 2.5, by Roland McGrath et al.

Copyright (C) 2006 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.

There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A

PARTICULAR PURPOSE.

Compiled by GNU CC version 4.1.2 20080704 (Red Hat 4.1.2-51).

Compiled on a Linux 2.6.9 system on 2012-02-21.

Available extensions:

The C stubs add-on version 2.1.2.

crypt add-on version 2.1 by Michael Glad and others

GNU Libidn by Simon Josefsson

GNU libio by Per Bothner

NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk

Native POSIX Threads Library by Ulrich Drepper et al

BIND-8.2.3-T5B

RT using linux kernel aio

Thread-local storage support included.

For bug reporting instructions, please see:

.

由于Linux操作系統的特有elf加載順序. (可以參考此文). 雖然可以很大程度上解決Windows早期版本的dll hell問題, 但是給部署帶來了很大難度

一般常見的解決方法是, 找到一個與目標Linux版本及glibc版本一致的Linux, 將代碼及依賴包放在之上編譯, 完成后再發布.這種方法與Linux下常見軟件安裝方法類似. 但是對于商用服務器部署步驟來說未免繁瑣, 安全性低.

還有一種方法,使用靜態鏈接. 將所有可執行文件文件依賴的靜態庫, 系統庫,全部靜態鏈接到可執行文件中,可以一次性解決這個問題

步驟:

1. 在gcc鏈接命令行中添加-static -static-libgcc -static-libstdc++

2. 將第三方依賴庫打開靜態鏈接開關, 將原來鏈接.so的庫,全改為鏈接.a

3. gcc對鏈接庫順序很敏感, 鏈接庫順序需要按照從前至后為:? 項目產生的靜態庫 > 第三方庫靜態庫 > 系統靜態庫

4. 鏈接時, 若有未解決的symbol, 可以嘗試在最后添加-lpthread及-lrt解決

在發布版本Linux上運行可能遇到的問題:

terminate called after throwing an instance of 'std::runtime_error'

what(): locale::facet::_S_create_c_locale name not valid

解決方法: 執行之前運行export LC_ALL="C"

總結

以上是生活随笔為你收集整理的linux很多程序都要本地编译,让C/C++程序一次编译可以发布到多版本Linux之上的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。