2010-09-09 161 views
4

錯誤發生在API:錯誤C2375:重新定義;不同的連鎖

#define DLLEXPORT extern "C" __declspec(dllexport) 
DLLEXPORT int CAnyseeUSBTVControllerDlg::InitCaptureDevice() 
{ 

在我的.h庫類和函數的定義:

class CAnyseeUSBTVControllerDlg : public CDialog 
{ 
// Construction 
public: 
    int InitCaptureDevice(void); 

不知道如何解決它?

「錯誤1個錯誤C2375: 'CAnyseeUSBTVControllerDlg :: InitCaptureDevice' :重新定義;不同 聯動C:\程序 文件\ toATS_DVS \ anysee \ anyseee30 \ anyseee30 \ anyseeUSBTVControllerDlg.cpp 122 anyseee30」

+0

你確定需要創建一個非靜態成員函數'extern「C」'? – 2010-09-09 13:54:04

+0

是的,我需要將.dll添加到我的Python應用程序 – CarolusPl 2010-09-09 13:55:37

+0

也許您應該使用靜態方法?否則,你有一個隱含的指針,你需要照顧。既然你不是全班出口,我不確定它會起作用。 – Rod 2010-09-09 14:12:48

回答

5

您必須確保在頭文件中使用相同的聲明。否則它被視爲不同的方法。

class CAnyseeUSBTVControllerDlg : public CDialog 
{ 
// Construction 
public: 
    int InitCaptureDevice(void); 
    DLLEXPORT int CaptureDevice(void); 

Using dllimport and dllexport in C++ Classes

+0

錯誤C2144:語法錯誤:'int'應該在';'之前; – CarolusPl 2010-09-09 14:00:59

+0

有人可以在這種情況下糾正宏嗎?我認爲我的意圖是正確的。也許外部「C」不能用於成員方法? – Rod 2010-09-09 14:11:18

1

你不能有DLLEXPORT.cpp文件規定,但不是在一個頭文件(否則編譯器將這些功能作爲不同的)。

使您的定義也DLLEXPORT

1

http://tldp.org/HOWTO/C++-dlopen/thesolution.html

C++有一個特殊的關鍵字來聲明 函數C綁定:外部的 「C」。 聲明爲extern「C」的函數使用 函數名稱作爲符號名稱,僅將 用作C函數。因此,只有 非成員函數可以被聲明爲 作爲extern「C」,並且它們不能被 重載。

我相信靜態成員也可能是extern "C",但是你不能直接做你想做的事情。你需要創建一個只調用C的包裝器接口來調用你的類成員函數。你可以在extern "C"的包裝器中暴露你的DLL之外的東西。

2

因爲

  1. 您與 不同的可見性(extern VS static
  2. 同上,但 不同的名字改編(extern "C" VS extern "C++"
  3. 定義在不同的地方函數的原型可能發生這種情況
  4. 同上但是不同的dll導出(__declspec(dllimport) vs __declspec(dllexport))。

來解決,啓用/文件p來看看它們是如何預處理(這必須是由文件的基礎文件,並且將停止生成.OBJ該文件),尋找與.i文件結果。

或者使用/ displayincludes,或者簡單地通過代碼。

0
//foo.h 

#pragma once 
#ifdef FOO_EXPORTS 
#define FOO_API __declspec(dllexport) 
#else 
#define FOO_API __declspec(dllimport) 
#endif 

namespace foo 
{ 
    class Baz 
    { 
    public: 
     FOO_API static auto say_hello() -> void; 
    }; 
} 

關鍵的東西,沒有那麼多的功能名稱,或者我使用尾隨返回類型的,是你把#define的__declspec的名稱要導出函數的前面,就像你會打字。

也將做在函數定義一樣:

//foo.cpp 

#include "foo.h" 

namespace foo 
{ 
    FOO_API auto Baz::say_hello() -> void 
    { 
     do 
     { 
      MessageBox(nullptr, L"Seems to be working okay!", L"OK", MB_OK); 
      exit(1); 
     } 
     while (0); 
    } 
} 

功能的實現並不重要,只要你把FOO_API在前面。