2012-04-12 90 views
0

在構建共享對象時,我忘記了將第三方「頭僅」頭庫(.h)文件放入正確的路徑。它建立得很好 - 回顧性地令人驚訝。由於缺少頭文件導致的段錯誤

當我的共享對象中使用第三方庫時,運行段錯誤發生在該行的恰好位置。

我不明白的部分是當我將這些頭文件複製到#include指定的路徑時,我無法導致段錯誤。我甚至沒有重新構建這個對象。非常奇怪的是,當我mv的頭文件在目錄中,它仍然工作 - 沒有段錯誤。但是,當我完全掌握這個目標時,它就崩潰了。它是否查找當前目錄和子目錄的頭文件?我也有標準的只有標題庫(?)/usr/local/include

我以前沒有使用共享對象。我通常創建靜態對象並將它們包含在構建中。我用來創建共享對象的標誌是-shared -fPIC

我想了解此行爲。由於部署,這很有趣。在生產計算機上部署時是否需要包含這些頭文件?基本上我不想把它作爲一個依賴項,因爲它是一個「僅標題」的庫。

編輯

代碼:

#include <rapidjson/document.h> 
#include <rapidjson/writer.h> 
#include <rapidjson/stringbuffer.h> 

void MyClass::myFunction() 
{ 
    rapidjson::StringBuffer string; 
    rapidjson::Writer<rapidjson::StringBuffer> jsonWriter(string); 
} 

這裏是調試會話的鏈接: http://pastebin.com/a0FaQwf1

+3

這可能是因爲當你沒有包含頭文件時,自動生成的函數原型可能會與實際函數不匹配,所以編譯器會做一些愚蠢的事情導致段錯誤。 – 2012-04-12 10:05:07

+0

此外,您長期以來一直是會員,所以您應該知道我們需要查看一些代碼才能真正幫助您。 – 2012-04-12 10:08:48

+1

任何編譯器警告? – 2012-04-12 10:15:54

回答

0

你永遠不需要爲了運行的頭文件提供給用戶程序。

你的圖書館可能只是細化違約, 這就是爲什麼它在編譯時

0

的怪異舉動的解釋失蹤時不會失敗的原因/刪除行爲可能是因爲共享對象仍然加載到內存在移動過程中,並在include目錄中保留了一個打開的文件句柄。

你知道,在ext2/3/4下打開的文件連接到inode而不是dir路徑。因此移動一個打開的文件不會有害。另一方面,IIRC也不會造成傷害。釋放inode將被推遲,直到所有進程關閉文件。也許這只是發生在你的mv和rm之間。

+0

你能指出這方面的文檔嗎?另外,如果移動是在同一文件系統中,那麼只有在移動「不會造成傷害」時纔會發生這種情況...... – notlesh 2015-04-16 20:09:04

+0

對不起,我手邊沒有文檔,需要自己搜索。你說得對,這隻有在一個文件系統中才是真實的。 – bjhend 2015-05-28 08:34:45

相關問題