未导出的 C 函数
C Functions not being exported
完成一个必须实现 Win32 的作业后 window,我想将我的函数导出到一个 dll。
令人惊讶的是链接器抱怨未引用的链接,虽然
- __declspec(dllexport) / __declspec(dllimport) 被正确定义和使用(或者像我从 C++ 习惯的那样)。
- 库已正确指定给链接器。
- 这些函数在 dependency walker 中可见。
链接器总是抱怨(德语):
error 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)" in Funktion "main".
C:\Users\jkirs\Desktop\Workspace\MSVC2015_x86_64-release\Unit.MSVC2015-x86-64.88a6cdd3\intermediate.Unit.exe
: fatal error 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”结尾。
编辑:
该库应该再次用于 C 代码。
看来你知道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 似乎是一个明智的地方,但是 extern "C"
是具有不同规则的不同野兽;你可以在这里阅读更多关于它的内容 In C++ source, what is the effect of extern "C"?
毕竟,我所做的一切都很好,但构建系统除外。
事实证明构建系统将文件作为 C++ 源文件而不是普通 C 文件处理。
完成一个必须实现 Win32 的作业后 window,我想将我的函数导出到一个 dll。
令人惊讶的是链接器抱怨未引用的链接,虽然
- __declspec(dllexport) / __declspec(dllimport) 被正确定义和使用(或者像我从 C++ 习惯的那样)。
- 库已正确指定给链接器。
- 这些函数在 dependency walker 中可见。
链接器总是抱怨(德语):
error 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)" in Funktion "main". C:\Users\jkirs\Desktop\Workspace\MSVC2015_x86_64-release\Unit.MSVC2015-x86-64.88a6cdd3\intermediate.Unit.exe : fatal error 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”结尾。
编辑: 该库应该再次用于 C 代码。
看来你知道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 似乎是一个明智的地方,但是 extern "C"
是具有不同规则的不同野兽;你可以在这里阅读更多关于它的内容 In C++ source, what is the effect of extern "C"?
毕竟,我所做的一切都很好,但构建系统除外。 事实证明构建系统将文件作为 C++ 源文件而不是普通 C 文件处理。