2012-03-15 48 views
1

我正在使用Visual Studio 2010編寫的預編譯庫(.lib)。我的解決方案有兩個項目。第一個項目(C)構建庫。第二個項目(C++)是一個用於測試庫的Win32控制檯應用程序。我試過的所有東西都不能解決鏈接器錯誤。 (我認爲這很容易,因爲一切都在相同的解決方案。)任何指針將不勝感激。謝謝。如何在Visual Studio中使用預編譯庫生成應用程序

這裏是我收到鏈接器錯誤:

1> MyProject.obj:錯誤LNK2019:無法解析的外部符號 「無效__cdecl創建my_function(無效)」(?創建my_function @@ YAXXZ)函數引用_wmain

1> C:\ Documents和Settings \用戶\桌面\ MySolution \調試\ MyProject.exe:致命錯誤LNK1120:1周無法解析的外部

這是Win32控制檯應用程序的代碼:

#include "stdafx.h" 
#include "my_api.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    my_function(); 

    return 0; 
} 

這裏的my_function是如何在my_api.h聲明:

extern VOID my_function(VOID); 
+0

C++項目的庫路徑中的.c庫的輸出目錄是什麼?不幸的是,僅僅讓它們在同一個解決方案中是不夠的(與C#相反,它很容易) – 2012-03-15 17:57:58

+0

不要讓我們猜測鏈接器錯誤。 – 2012-03-15 18:05:13

+0

@HansPassant:我很抱歉。謝謝你的禮貌。我添加了鏈接器錯誤和導致它的代碼。 – 2012-03-15 19:11:43

回答

2

您需要declare your function with C linkage,以便鏈接器明白,這些功能是在C代碼中定義,而不是C++代碼:

// my_api.h 
#ifdef __cplusplus 
extern "C" { 
#endif 

extern VOID my_function(VOID); 
// more function declarations etc. 

#ifdef __cplusplus 
} 
#endif 

如果您只有一個功能,可以放下大括號:

// my_api.h 
#ifdef __cplusplus 
extern "C" 
#endif 
extern VOID my_function(VOID); 
+0

他們都是很好的答案,但我接受你,因爲你的反饋解決了我甚至沒有考慮過的問題。謝謝! – 2012-03-15 19:49:53

1

確保庫項目的輸出目錄(無論$(OutDir)擴展到該項目中)位於測試項目的鏈接器搜索路徑中。爲此,請轉到項目「屬性」對話框。在Linker -> General下,確保目錄設置爲Additional Library Directories。此外,請確保在Linker -> Input下文庫本身(my_api.lib)已列在Additional Dependencies中。

+0

感謝您的好評!您幫助清理了我的項目設置。 :) – 2012-03-15 19:50:34

相關問題