2012-10-16 93 views
1

我有使用鐺++ 3.2即建立一些庫的Ubuntu 12.04下開發一個C++源樹,然後編譯與這些庫和其他各種系統庫的通常收集一些應用。兩個謎題。客戶端報告代碼無法使用clock_gettime()的未定義引用進行構建。果然,我沒有在構建邏輯(scons)中包含義務性的「-lrt」。人咬狗:符號解析*無*鏈接庫? clock_gettime()-lrt

第一個難題:即使我沒有在任何地方指定「-lrt」,這個編譯,鏈接和正確執行並且沒有抱怨我的系統!這個符號如何正確解決?我懷疑這是因爲應用程序鏈接到一個本身需要librt的動態庫,但我不明白爲什麼會發生這種情況。

二字謎:假設clock_gettime()獲取如何不「-lrt」,爲什麼會出現這種情況我的系統上解決了滿意的解釋,但不是在客戶端非常類似的設置?

「......一個謎,包裹在一個謎,一個謎內」 ---丘吉爾

建議工具揭示了什麼是真的在這裏將是非常歡迎。

+0

這也許是特定版本/叉/在一個系統上GCC的分支,是挑剔有關鏈接反對甚至是標準庫函數庫1337用戶。恕我直言,編譯器的正常/可接受行爲是在C標準庫中使用頭文件和函數時自動提供需要鏈接的所有庫。如果編譯器不這樣做,這是廢話。 – 2012-10-16 05:52:49

+0

@ H2CO3:這聽起來像'#pragma lib'解決方案,我認爲它仍然是MSVC獨有的。順便說一下'clock_gettime'不是一個標準的C函數。 – MSalters

回答

3

從SUSv4(工具/ C99):


-l rt

此選項應提供所有接口<aio.h>參考,<mqueue.h><sched.h><semaphore.h><spawn.h>,接口標記爲可選在<sys/mman.h>,接口標記爲ADV(諮詢信息)<fcntl.h>,和接口以前綴clock_開始和time_<time.h>如果沒有此選項,實現可能會搜索此庫。


我相信以上足以至少說明爲什麼這種行爲是通過POSIX允許的。

最有可能涉及的系統在這方面是不同的。例如,clock_gettime()可能在libc爲你實現,但在librt爲您的客戶。不要冒險:使用便攜式的-l rt,忘掉這個問題。

一個更明顯的例子是-l xnet,根據POSIX其行爲相似,但至少在Gentoo,Debian和Ubuntu Linux系統上,使用-l xnet進行編譯實際上會產生錯誤。 (libxnet據稱包含UNIX套接字接口的實現。)

如果您想進一步調查該問題,請嘗試在GNU/Linux系統中使用lddldd應顯示二進制文件的動態依賴關係。我敢打賭,clock_gettime()只是在libc.so實施。