2013-03-05 80 views
0

在Visual Studio中是否可以使用C++庫和使用C編寫的另一個項目在同一個解決方案中,這個庫使用C?在Visual Studio中使用相同的解決方案從C++庫調用函數的C編譯項目

我在庫的頭什麼:

#ifdef __cplusplus 
    #define EXTERN extern "C" 
#else 
    #define EXTERN 
#endif 

#ifndef LIB_API 
    #ifndef LIB_STATIC 
    #ifdef LIB_EXPORT 
     #define LIB_API EXTERN __declspec(dllexport) 
    #else 
     #define LIB_API EXTERN __declspec(dllimport) 
    #endif 
    #else 
    #define LIB_API 
    #endif 
#endif 

LIB_API uint32_t Func(int8_t *arg); 

我想靜態鏈接到從我的C-項目這個庫,所以我選擇從庫項目依賴關係,定義了預處理器定義宏LIB_STATIC,選擇「編譯爲C代碼(/ TC)」選項並調用此函數。我得到的是鏈接錯誤

error LNK2019: unresolved external symbol _Func referenced in function _main 

當我看着LIB文件,我可以找到有什麼樣Func鍵,而不是_Func。我做錯了什麼?

(忘了補充,有圖書館的一個.cpp模塊在相應的功能實現)從Angew

接聽和AnatolyS

我們需要在靜態庫情況下,這樣的定義LIB_API爲e​​xtern正確的預處理塊將是:

#ifndef LIB_API 
    #ifndef LIB_STATIC 
    #ifdef LIB_EXPORT 
     #define LIB_API EXTERN __declspec(dllexport) 
    #else 
     #define LIB_API EXTERN __declspec(dllimport) 
    #endif 
    #else 
    #define LIB_API EXTERN 
    #endif 
#endif 
+0

_Func = FUNC鍵,爲了包括所需要的庫,你將需要添加這些項目下 - >屬性 - >鏈接器 - >輸入 - >附加依賴: – 2013-03-05 10:53:43

+0

'在預處理器定義定義宏LIB_STATIC,選擇「編譯爲C代碼(/ TC)」選項 - 我明白你在C項目中做過,而不是在C++ lib中,對吧? – 2013-03-05 10:59:51

+0

在靜態庫的情況下不應該將'LIB_API'定義爲'EXTERN'嗎? – Angew 2013-03-05 11:03:22

回答

0

要使用C++函數的C代碼,你有這樣的功能,導出爲C,那麼改變你的LIB_API的定義靜態鏈接:

#else 
#define LIB_API EXTERN 
#endif 
相關問題