C未导出的功能

时间:2016-04-11 16:43:20

标签: c visual-c++ dll dllimport dllexport

在我完成了一个必须实现Win32窗口的分配之后,我想将我的函数导出到一个dll。

令人惊讶的是链接器抱怨未引用的链接,尽管

  • __ declspec(dllexport)/ __declspec(dllimport)已正确定义和使用(或者我习惯使用C ++)。
  • 正确地为链接器指定了库。
  • 这些功能在依赖漫步者中可见。

链接器总是抱怨(用德语):

  

错误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代码。

2 个答案:

答案 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。