1

Micro-manager と呼ばれるオープンソース ソフトウェア用のデバイス アダプターを作成して顕微鏡を制御しようとしていますが、直面している問題がいくつかあります。これらの 2 つのファイル (1 つのヘッダーともう 1 つの CPP) が既に存在します。 Micro-Manager のオープン ソース パッケージに含まれています。

//MoudluleInterface.h

#ifndef _MODULE_INTERFACE_H_
#define _MODULE_INTERFACE_H_

#ifdef WIN32
#ifdef MODULE_EXPORTS
  #define MODULE_API __declspec(dllexport)
#else
  #define MODULE_API __declspec(dllimport)
#endif

#else
#define MODULE_API
#endif
#define MM_MODULE_ERR_OK 1000
#define MM_MODULE_ERR_WRONG_INDEX   1001
#define MM_MODULE_ERR_BUFFER_TOO_SMALL 1002

 ///////////////////////////////////////////////////////////////////////////////
 // header version
 // NOTE: If any of the exported module API calls changes, the interface version
 // must be incremented
 // new version 5 supports device discoverability
 #define MODULE_INTERFACE_VERSION 7

#ifdef WIN32
const char* const LIB_NAME_PREFIX = "mmgr_dal_";
#else
const char* const LIB_NAME_PREFIX = "libmmgr_dal_";
#endif

#include "MMDevice.h"

///////////////////////////////////////////////////////////////////////////////
// Exported module interface
///////////////////////////////////////////////////////////////////////////////
 extern "C" {
 MODULE_API MM::Device* CreateDevice(const char* name);
 MODULE_API void DeleteDevice(MM::Device* pDevice);
 MODULE_API long GetModuleVersion();
 MODULE_API long GetDeviceInterfaceVersion();
 MODULE_API unsigned GetNumberOfDevices();
 MODULE_API bool GetDeviceName(unsigned deviceIndex, char* name, unsigned      bufferLength);
 MODULE_API bool GetDeviceDescription(const char* deviceName, char* name, unsigned bufferLength);

これらの関数を定義する CPP ファイルの一部を次に示します。

      //ModuleInterface.cpp
      #define _CRT_SECURE_NO_DEPRECATE
      #include "ModuleInterface.h"
      #include <vector>
      #include <string>

        typedef std::pair<std::string, std::string> DeviceInfo; 
        std::vector<DeviceInfo> g_availableDevices;

      int FindDeviceIndex(const char* deviceName)
   {
  for (unsigned i=0; i<g_availableDevices.size(); i++)
  if (g_availableDevices[i].first.compare(deviceName) == 0)
     return i;

   return -1;
   }

  MODULE_API long GetModuleVersion()
 {
 return MODULE_INTERFACE_VERSION;   
 }

  MODULE_API long GetDeviceInterfaceVersion()
 {
return DEVICE_INTERFACE_VERSION;   
 }

 MODULE_API unsigned GetNumberOfDevices()
{
 return (unsigned) g_availableDevices.size();
 }

 MODULE_API bool GetDeviceName(unsigned deviceIndex, char* name, unsigned bufLen)
{
 if (deviceIndex >= g_availableDevices.size())
  return false;

問題は、エラー C2491 (dllimport 関数の定義が許可されていません) が表示されることです。これについて調査しましたが、通常は、関数が宣言されているときに関数が定義されている場合に、ModuleInterface.h で既に関数を定義しています。 ModuleInterface.cpp で使用しましたが、それでも同じエラーが表示されます。このエラーが発生する他の可能性はありますか? それともコードに何か問題がありますか?

4

1 に答える 1

2

定義で MODULE_API 宣言を繰り返すことは想定されていません。宣言の一部として使用するだけで十分です。.cpp ファイルから MODULE_API の使用を削除すると、コードがコンパイルされるはずです。

于 2013-07-10T14:51:18.020 に答える