2011-04-08 62 views
1

親愛的, 這是我的命令鏈接庫,並生成一個EXE:LD未鏈接

ld -o readgfile readg_x.o MedLib_x.o cdrsort.o mtcprc.o encoder.o mtcbuil.o dbtprc.o dbtbuil.o DFMLIB_x.o Dyn_SQL_x.o /home/med/src/api/libnapi.a /home/med/src/api/libtabs.a $ORACLE_HOME/lib/libclntsh.so 

但是當我運行命令未能找到從歸檔文件中readg_x.o使用的功能libtabs.a。這裏有錯誤,如:

readg_x.o: In function `main': 
/home/med/src/readg/readg_x.c:565: undefined reference to `options' 
/home/med/src/readg/readg_x.c:570: undefined reference to `oraconnect' 
/home/med/src/readg/readg_x.c:591: undefined reference to `oracommit' 
+0

這不是lds故障。你的代碼有問題。也許你正在使用一個變量/函數,它是在一個頭文件中導出的,但並未實現。 – halfdan 2011-04-08 13:22:49

+0

感謝Haldan的回覆。那麼所有這些功能都實現了。 – QMG 2011-04-08 14:02:47

回答

1

該錯誤是指圖書館libtabs.a不包含你的想法。您可以使用像objdump這樣的工具來列出庫中定義的所有符號,以確保您期望的是真實的。

+0

謝謝亞倫。我用nm命令檢查過這些符號是在libtabs.a中定義的 – QMG 2011-04-08 14:05:28

+0

您是否在頭文件中定義了它們,以便在'readg_x.c'中已知類型? 'readg_x.c'和C源文件中的類型是否相同?編譯爲'libtabs.a'?如果你編寫一個包含「options」的小C文件並將其添加到'ld'命令,會發生什麼? – 2011-04-08 15:58:17

+0

我已經檢查過一個小型的c程序,它被編譯並執行:( – QMG 2011-04-12 07:24:01

1

你有兩個問題:

  1. 你正在試圖建立一個可執行文件ld。一旦設法實際將其鏈接起來,由此產生的可執行文件將在啓動時崩潰,因爲您在C啓動時沒有正確鏈接(crt0.o)。在UNIX/Linux上,應該使用從不使用使用ld來鏈接任何東西(連接OS內核或引導加載程序的罕見例外)。你應該總是使用編譯器驅動程序,而不是像這樣:gcc -o readgfile readg_x.o MedLib_x.o ...
  2. 即使你聲稱oraconnect等在libtabs.a定義,他們不是(或至少他們沒有被定義爲全局符號)。如果沒有readelf -s libtabs.a | grep oraconnect的輸出,很難告訴究竟發生了什麼,但是您斷言該庫中定義的符號肯定是錯誤的。
+0

親愛的ER,謝謝你的回覆。這裏是你告訴readelf -s libtabs命令的輸出。a | grep oraconnect 77:0000000000000647 860 FUNC GLOBAL DEFAULT 1 oraconnect 87:00000000000009fc 634 FUNC GLOBAL DEFAULT 1 oraconnect_ret我正在編譯-o,但它也給出相同的錯誤 – QMG 2011-04-12 06:47:25