在 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