在我完成了一个必须实现Win32窗口的分配之后,我想将我的函数导出到一个dll。
令人惊讶的是链接器抱怨未引用的链接,尽管
链接器总是抱怨(用德语):
错误LNK2019:Verweis auf nicht aufgel÷stes externes Symbol “”__ declspec(dllimport)struct cw_Window * __cdecl createWindow(char *,unsigned short,unsigned short)“(__ imp_?createWindow @@ YAPEAUcw_Window @@ PEADGG @ Z)”在Funktion“main”中。 C:\ Users \用户jkirs \桌面\工作区\ MSVC2015_x86_64释放\ Unit.MSVC2015-x86-64.88a6cdd3 \ intermediate.Unit.exe :致命错误LNK1120:1 nicht aufgel÷ste Externe
我的函数原型定义如下:
typedef struct cw_Window cw_Window_t;
typedef struct cw_Event cw_Event_t;
API cw_Window_t* createWindow(char* pTitle, uint16_t nWidth, uint16_t nHeight);
API void destroyWindow(cw_Window_t* pWindow);
API void pollEvent(cw_Window_t* pWindow, cw_Event_t* pEvent);
其中“API”定义如下:
#ifdef _MSC_VER
#ifdef CW_EXPORT
#define API __declspec(dllexport)
#else
#define API __declspec(dllimport)
#endif
#else
#define API // TODO
#endif
我尝试将'extern“C”添加到'API'定义中,但没有结果,但抱怨字符串文字'C'。
有没有人亲自遇到过这个问题,可以指出我正确的方向吗?
如果重要:我是uinsg Visual Studio C ++ 2015(MSVC_x86_64);我的头文件以'.h'结尾,源文件以'.c'结尾。
编辑: lib应该再次用于C代码。
答案 0 :(得分:0)
所以看来你知道extern "C"
的基本问题和近似解决方案。但是你的错误是:不要将extern "C"
放在API定义中。用它包装定义和声明:
typedef struct cw_Window cw_Window_t;
typedef struct cw_Event cw_Event_t;
extern "C" {
API cw_Window_t* createWindow(char* pTitle, uint16_t nWidth, uint16_t nHeight);
API void destroyWindow(cw_Window_t* pWindow);
API void pollEvent(cw_Window_t* pWindow, cw_Event_t* pEvent);
}
我知道它看起来像extern
而你正在尝试的东西似乎是一个合理的地方放置外部,但extern "C"
是一个不同规则的不同的野兽;你可以在这里阅读比你想要的更多的内容In C++ source, what is the effect of extern "C"?
答案 1 :(得分:0)
毕竟,我所做的一切都很好但是构建系统。 原来,构建系统将文件作为C ++源文件而不是普通的C。