簡體   English   中英

在Visual Studio的同一解決方案中生成C項目以從C ++庫調用函數

[英]Build C project to call functions from C++ library in the same solution in Visual Studio

在Visual Studio中,是否可以在同一解決方案中擁有一個帶有C ++庫的項目,而另一個項目又由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定義為EXTERN,以便正確的預處理器塊為:

#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

要從C代碼使用C ++函數,您必須將此類函數導出為C,因此請更改LIB_API的定義以進行靜態鏈接:

#else
 #define LIB_API EXTERN
#endif

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM