0

在 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
4

1 回答 1

0

要从 C 代码中使用 C++ 函数,您必须将此类函数导出为 C,因此更改 LIB_API 的定义以进行静态链接:

#else
 #define LIB_API EXTERN
#endif
于 2013-03-05T11:16:11.520 回答