簡體   English   中英

如何在centos6上分發C ++ 11共享庫

[英]How to distribute c++11 shared library on centos6

我有一個c ++ 11庫( https://github.com/matiu2/cdnalizer )。 我想在centos6和ubuntu12.04 LTS上分發它。

它可以在Ubuntu 13.10和Gentoo上愉快地編譯。

我嘗試使用盡可能多的靜態性進行編譯,但它仍然取決於centos沒有的glibc:

matiu@matiu-laptop:~/projects/cdnalizer/build/src/apache$ readelf -d mod_cdnalizer.so | grep NEED
 0x0000000000000001 (NEEDED)             Shared library: [libapr-1.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000006ffffffe (VERNEED)            0xd520
 0x000000006fffffff (VERNEEDNUM)         3

構建線:

/usr/bin/g++  -fPIC -I/usr/local/include -I/usr/include -I/usr/include/x86_64-linux-gnu -I/usr/include/x86_64-linux-gnu/c++/4.8 -Wall -Wextra -g   -shared -Wl,-soname,mod_cdnalizer.so -o mod_cdnalizer.so CMakeFiles/mod_cdnalizer.dir/mod_cdnalizer.cpp.o CMakeFiles/mod_cdnalizer.dir/config.cpp.o CMakeFiles/mod_cdnalizer.dir/filter.cpp.o ../libbase.a -lapr-1 

我曾嘗試在centos上編譯gcc-4.8.2,但是它生成的二進制文件具有類似的glibc依賴項:

[root@matt src]# ./test_config 
./test_config: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./test_config)
./test_config: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./test_config)

我聽說您無法逃避共享庫的glibc依賴關系,因為c ++會拋出異常,因此需要共享的libstdc ++(但我的lib不會跨庫邊界拋出異常)。

我還聽說您無法靜態鏈接glibc,因為靜態庫不是使用-fPIC編譯的。


我的主要問題是:

  • 如何在centos6上分發我的c ++ 11共享庫?

我的子問題是:

  • 我可以在ubuntu 13.10上編譯一個c ++ 11共享庫,並在centos6(和較舊的ubuntus)上加載它嗎? 怎么樣 ?
  • 我可以在centos6上編譯一個c ++ 11共享庫,並且可以在標准centos安裝上運行嗎?

(不用擔心Apache2.2 vs 2.4的依賴..這很容易)

我可以在centos6上編譯一個c ++ 11共享庫,並且可以在標准centos安裝上運行嗎?

如果您無法使用標准CentOS 6 g ++ / glibc / libstdc ++構建代碼,則不會,它不會在標准CentOS 6安裝中運行。

CentOS發行版提供長期支持(LTS)。 關鍵錯誤會通過更新得到修復,但是軟件通常不會更改。 這是一個功能 即使有了第三方存儲庫(例如EPEL),可用於CentOS的軟件並不是真正的最新版本。

我可以在ubuntu 13.10上編譯一個c ++ 11共享庫,並在centos6(和較舊的ubuntus)上加載它嗎? 怎么樣 ?

如果可以使用g ++ 4.4工具鏈進行編譯,請確保。 在這種情況下,您不能使用更高級的編譯器。 在Ubuntu 12.04 LTS軟件包列表中進行的快速搜索顯示使用libstdc++.so.6的版本的libstdc++.so.6 6-4.5-dbg,基於上述錯誤消息,該版本向后不兼容。

如何在centos6上分發我的c ++ 11共享庫?

如上所示,您將至少擁有一個更新的依賴項( libstdc++.so.6 ),您需要libstdc++.so.6依賴項隨庫一起提供,並安裝在某個奇怪的位置,這會帶來很多麻煩( LD_LIBRARY_PATH ,會發生什么情況)到任何其他C ++插件等)。 並在某個時候進行更新。

一些企業用戶會反對這樣的事情,主要是因為它與現有的操作系​​統不兼容。

靜態鏈接依賴項(例如在Ali的下面帶有Developer Toolset 的答案中)也可以工作。 它也不是沒有問題(再次更新到依賴項),但是可能是您的代碼在CentOS 6上運行的最佳機會。

從對阿里答案的評論中可以看出, devtools 1 (gcc 4.7.0)無法正常工作,因此devtools 1.1不太可能正常工作。 因此,在這種情況下,您似乎確實需要達到gcc 4.8級別的C ++ 11支持。

您的問題與GLIBC

您的問題是libstdc++.so.6上的libstdc++.so.6太舊了。

根據發行商的說法 ,CentOS 6.5隨GCC 4.4.7一起提供。 在GCC 4.8中,對C++11支持大部分已完成,而在4.4中,該支持才不完整

如果您可以使用GCC 4.4.7構建您的庫,那么它應該可以工作(前提是您在足夠老的系統上構建它)。 如果不能,則必須在目標CentOS系統上更新GCC。

另外,您可以分發libstdc ++。so.6的較新版本(GCC 4.8中的一個),將其安裝在非默認位置,然后要求您的客戶鏈接到該較新版本(通過LD_LIBRARY_PATH ,或者通過提供適當的-Wl,-rpath=...鏈接時顯示-Wl,-rpath=...選項)。

簡而言之:

  1. 事物僅向后兼容。 您需要選擇要支持的發行版的最舊發行版,並以此為基礎。 該發行版的更高版本很可能是向后兼容的,因此您的共享庫將在更高版本上正常運行。

  2. 您或者需要從源代碼構建帶有C ++ 11支持的編譯器,或者從發行版的某些存儲庫中安裝它。 由於兼容性問題,請盡可能使用后者。

  3. 任何非系統庫都應靜態鏈接到共享庫中: -Wl,--static -lmylib1 -lmylib2 -Wl,--dynamic 在這里重要的是,在所有靜態鏈接的內容之后, -Wl,--dynamic最后是。


我自己還沒有嘗試過,但是經常這樣做的同事說:

  • 使用CentOS 6.5 (撰寫本文時,最新的6.x版本)。

  • 安裝devtools /開發人員工具集 兼容性問題應該由開發人員工具的特殊修補版本解決。 Developer Toolset 2.1 Beta隨附gcc 4.8。

  • 靜態鏈接所有第三方庫和libstdc++ 但是,無論如何都不要靜態鏈接應該在目標計算機上的glibc和其他系統庫。

我的同事以這種方式編譯的程序可以在我的Ubuntu計算機上正常工作。 (他使用CentOS 5.10,它似乎是最老的,仍受支持的具有glibc 2.5的發行版。)

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM