2016-10-16 123 views
0

我試圖從'test.c'& test.exp文件構建共享庫lib_test.so。這lib_test.so文件將用作另一個應用程序的擴展。 應用程序文檔通過以下命令指定代TLE lib_test.so文件的直接在單次通過:拆分生成一個共享對象庫(.so)文件,而不是一個

`gcc -q64 -o lib_test.so test.c -bM:Sre -bE:test.exp -bnoentry` 

但我的要求是建立在兩次通過庫:

  1. 編譯以生成test.o文件使用gcc命令。
  2. 鏈接生成庫lib_test.so使用ld命令。

我嘗試這樣做如下:

  1. 執行的編譯步驟如下:gcc -q64 -c -o test.o test.c
  2. 創建lib_test.so如下:ld -bM:Sre -bE:test.exp -bnoentry -o lib_test.so test.o

但它不是產生一個適當的lib_test.so文件。

我使用Ubuntu 16.04 LTS 64位與最新的GCC

可否請您建議的過程分成兩個傳遞正確的方法...

感謝&問候。

+0

你的意思是「它沒有生成正確的'lib_test.so'文件」?你有構建錯誤嗎?加載庫時出錯?還有別的嗎?請詳細說明。 –

+0

當我一次構建'lib_test.so'時,我得到12619字節大小的文件,應用程序加載該庫很好,但在構建兩次使用時,輸出'lib_test.so'文件爲11816字節,應用程序顯示'loading extension failed' for'lib_test.so'錯誤。 – Anirban

回答

1

與GCC前端程序gcc和實際鏈接程序ld鏈接的最大區別在於GCC前端添加了一些要鏈接的庫。最值得注意的是GCC運行時庫(-lgcc_s-lgcc)和實際的標準C庫(-lc)。

當您直接調用ld時,不要告訴它與這些庫鏈接。

在您不知情的情況下,可能還會有其他庫和標誌GCC前端傳遞到ld。對於「單程」構建,請將標誌-v傳遞給gcc以獲取詳細輸出,並查看它使用的參數,標誌和庫。

1

你很少想用ld來執行鏈接。 gcc前端在設置正確的標誌等方面做得更好。因此,使用gcc

即代替

ld -bM:Sre -bE:test.exp -bnoentry -o lib_test.so test.o 

gcc -bM:Sre -bE:test.exp -bnoentry -o lib_test.so test.o 

在你的第二個步驟。

+0

我無法在構建庫時手動運行這些命令。我必須將我的代碼(即'test.c'和'test.exp')放到指定的目錄中,並在makefile中添加'CFLAGS = '和'LDFLAGS = ',並且應用程序運行'gcc -c $ {CFLAGS} -o $ {OFILE} $ {IFILE}'來編譯並生成'test.o',然後運行'ld $ {LDFLAGS} -o $ {SOFILE} $ {OFILE}'。所有這些都是在內部完成的,我只需要使用''gcc'&'ld'來給出正確的標誌來獲取lib_'test.so',所以我要求兩步構建。 – Anirban

相關問題