2016-07-15 55 views
0

我有一個Cython擴展,我在Ubuntu 14上編譯並作爲Anaconda包上傳。我試圖在運行Scientific Linux(6?)的另一臺機器上安裝該軟件包,該軟件隨舊版本的glibc一起提供。當我嘗試導入模塊我得到的,看起來(像)的錯誤是:在Cython中鏈接到特定的glibc版本

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

當我說「像」 - 在「myprogram」實際上是擴展的。所以名字。

從我所瞭解的這個錯誤是因爲我有一個更新版本的glibc的構建系統,它具有memcpy函數的更新版本。

這個頁面有問題的一個很好的說明,以及一些相當不切實際的解決方案:http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc

還提出了一個更簡單的答案在這裏:How can I link to a specific glibc version?

我的問題是:如何將我將此解決方案到我的Cython擴展?假設__asm__解決方案的工作原理(如第二個鏈接中所述),將其加入到由Cython生成的C中的最佳方式是什麼?

此外,更一般地說,如何在其他模塊首先避免此問題?例如,我安裝並運行了一個預建的numpy副本,沒有任何問題。

回答

0

事實證明這很簡單。

創建下面的頭,glibc_fix.h __asm__(".symver memcpy,[email protected]_2.2.5")

然後通過使用CFLAGS="-include glibc_fix.h"包括它。這可以設置爲環境變量,或在setup.py中定義。

此外,事實證明numpy在這方面並沒有做任何特別的事情。如果我自己編譯它,它會鏈接到我的系統上的較新版本。