2016-10-02 57 views
2

我一直在32位機器上編程,直到最近,我升級到了64位。我在xubuntu 16.04(amd64)上使用最新版本的DMD(amd64)。DMD2無法在Linux上編譯共享庫,amd64

在升級之前,我可以使用dmd -shared 'FILES'輕鬆編譯共享庫,但是現在它會出現錯誤。 我有一個名爲QD文件:

module q; 

export extern(C) int abcd(){ 
    return 4; 
} 

,現在當我做dmd -shared 'q.d',我得到這個:

[email protected]:~/Desktop/temp$ dmd -shared q.d 
/usr/bin/ld: q.o: relocation R_X86_64_32 against `__dmd_personality_v0' can not be used when making a shared object; recompile with -fPIC 
q.o: error adding symbols: Bad value 
collect2: error: ld returned 1 exit status 
--- errorlevel 1 

當我做dmd -shared -fPIC q.d

[email protected]:~/Desktop/temp$ dmd -shared -fPIC q.d 
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libphobos2.a(exception_224_3b4.o): relocation R_X86_64_32 against `__dmd_personality_v0' can not be used when making a shared object; recompile with -fPIC 
/usr/lib/x86_64-linux-gnu/libphobos2.a: error adding symbols: Bad value 
collect2: error: ld returned 1 exit status 
--- errorlevel 1 

我怎樣才能得到它來編譯?

編輯:圖書館編譯罰款,如果我使用-m32標誌。

+0

這可能是因爲緩存的內容,您是否嘗試過'--force'?另外,我還記得安裝了'hardening-wrapper'的問題。刪除它爲我固定。 – weltensturm

+0

@weltensturm我嘗試過'dmd -shared --force q.d',但它說'--force'是一個無法識別的開關。我沒有安裝硬化包裝。 – Nafees

回答

2

哦,我剛剛意識到我知道這個問題,對不起,我花了那麼長時間才意識到它。

您只需要針對共享lib Phobos進行編譯以便在64位上創建共享庫。

dmd -shared q -m64 -fPIC -defaultlib=libphobos2.so 

-defaultlib switch告訴它使用備用庫。通過指定.so(與使用.a文件的默認靜態鏈接相反),它使用共享庫 - 它恰好也與-fPIC一起編譯,因此它們都是兼容的。

其中一個優點是可以在所有共享對象和D可執行文件之間共享一個運行庫,這意味着很多事情在您將它們全部分發時才起作用(不過請注意,您可能還需要編譯加載的程序這也與-defaultlib開關一樣)。在32位上,不使用這些選項構建庫,不管...但結果是在某些情況下可以看到多個定義的鏈接錯誤。

要注意的一點是,libphobos2.so文件現在也是運行時依賴項,一定要將它與自己的庫版本一起分發。您可能需要設置LD_LIBRARY_PATH或全局安裝,以便程序正常啓動,就像任何其他庫一樣(並且您可能想要對其進行版本升級)