2010-09-21 70 views
2

我對C++沒有任何重要經驗,但最近不得不使用C++部分(實際上是apache模塊)參與到項目中。無法解析的外部符號:符號名稱末尾的@ 12 vs @ 8

現在我只是試圖建立一些現有的很多遺留代碼,面臨着很奇怪的問題,當VC++鏈接器找不到在Apache庫一個特定功能(同時看到他們的其餘部分)。

的代碼是這樣的(從專門建造的瑣碎樣品取來解決這個問題):

ap_rputs(ap_gm_timestr_822(r->pool, time(NULL)), r);

(這應該只是打印當前日期,但它並不真正的問題太多)

而且我得到的錯誤是這樣的:

error LNK2019: unresolved external symbol [email protected] referenced in function _hello_handler

ñ這個函數實際上存在於我正在鏈接的庫中,但它的符號名稱存在於最後的_ap_gm_timestr_822 @ 8(不是@ 12,但是@ 8)。

我試圖在MSVC++中使用幾乎所有可能的編譯器/鏈接器屬性 - 不幸的是沒有效果。

這個問題可能與這個事實有關:這個庫(它是Apache 1.3發行版的一部分)是用一個不同於/我使用的編譯器構建的嗎?我目前正在使用MS VC++ Express 2008.如果是這種情況,是否有人知道如何解決這個問題?

回答

2

time_t typedef有兩種風格,傳統的32位將創建Y2K38問題和64位,解決這個問題。你在這裏有一個不匹配的。

檢查您使用的CRT的time.h頭文件,應該有一個#ifdef在其中選擇舊版和64位版本。如果您仍然希望在2038年成爲程序員,請避免使用遺留問題。

0

這些組成名稱是函數的名稱和參數類型的詳細信息。

所以你包含的頭文件聲明瞭函數的參數與你鏈接的庫不匹配。

當編譯器命令行中出現「-define」錯誤時,我最常遇到這種情況,因此在頭文件中選擇與您正在鏈接的lib不匹配的選項。通常這是選擇你想要的「線程」,或者如果你想要Unicode。

因此,檢查您的編譯器命令行是否正確匹配您的鏈接器命令行。

+0

我不認爲這可能是因爲兩者都來自Apache分佈? – 2010-09-21 15:54:06

+0

@Sergey,我敢打賭,有一些關於如何構建apache的選項,並且你對它們有一個錯位。 – 2010-09-21 15:55:31

+0

_USE_32BIT_TIME_T取得了訣竅! – 2010-09-21 16:29:58

3

在Visual Studio中,@後綴表示參數的總字節大小。這兩個函數之間的差異意味着簽名不匹配。最有可能的是,鑑於尺寸的差異,你試圖鏈接到64位的32位功能。