2012-02-02 58 views
1

我一直在構建一個C++庫,我想將它作爲single.so文件分發給我的用戶,並且希望這個.so文件在很大程度上與發行版無關。因此,我一直在靜態地鏈接第三方庫(但仍然動態鏈接到標準庫)C++ STL版本問題+提升

現在它可以在CentOS 6.2(64位)上使用g ++編譯,但它在CentOS 5.3上存在問題。編譯經過精細,但我得到一個鏈接錯誤:

cpu_timer.cpp:(.text+0x288): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<long double>(long double)' 

我已經做了錯誤的一些搜索和它似乎是與標準庫本身的版本問題。我的代碼,或者說boost :: thread的代碼,正試圖調用CentOS 5.3中包含的標準庫中不存在的更新版本的東西。

可以理解。所以,我需要:。

  • 鏈接靜態對C++標準庫(我已經做了一些研究,關於這一點,它是在64個系統上一個巨大的痛苦中的libstdC++一個包括在大多數64個系統是不是用-fPIC和-fPIC is actually a necessity to do static linking on 64 bit systems構建的,我將不得不自己構建libstdC++。呃...
  • 將boost :: timer恢復爲更兼容的版本我主要將它用於便攜式互斥體,所以我我們不需要任何需要出血性的boost :: thread特性,但是它帶有它自己的問題:boost網站上的哪些地方會將它們的依賴關係記錄到標準庫(以及哪些版本)中?他們是否記錄它我似乎無法找到這些信息,而且這是一個明智的選擇嗎?標準庫對我來說可能會帶來驚喜嗎?

鑑於我的目標(儘可能接近發行版不可知論者),您會推薦哪條路線?

+3

「*在boost網站上,他們是否將它們的依賴關係記錄到標準庫(以及哪些版本)中?他們是否記錄它?*」標準庫是_standardized_ - 他們爲什麼需要? API並沒有改變,只有ABI有過,而且這不在任何圖書館的控制範圍之內。 – ildjarn 2012-02-02 00:58:01

+0

@ildjarn也許,那麼ABI的變化是我的問題,而不是庫的界面的變化。無論哪種方式,我認爲它不會改變我需要做的事來解決問題,而且我仍然期望使用某種版本控制方案,即使對於標準庫也是如此。除了C++ 0x之類的標準之外,是否還有其他版本?在這種情況下,ABI是否改變了CentOS 5.3和6.2之間的唯一區別? – Ben 2012-02-02 01:07:16

+3

不同標準庫版本之間可能存在各種API更改,但它們不是_breaking_更改。事實上,ABI的變化是你的問題,我特別提到這一點,所以你會有東西在網上搜索。我不知道解決此問題的任何方法,這正是爲什麼大多數\ nix上的程序都是開源代碼的原因,因此可以將它們構建並鏈接到用戶系統上存在的標準庫。 – ildjarn 2012-02-02 01:10:28

回答

1

我想說的是使用一個版本的Boost,它足夠與所有你希望它兼容的發行版兼容。

+0

那就是我走的路線。構建libstdC++意味着構建gcc/g ++,它不適合心臟的佯攻。 – Ben 2012-02-02 17:20:58