2013-12-17 46 views
2

我試圖獲得一個運行AVT的VIMBA SDK的玩具程序。目前,除了一個警告外,這樣做很好。當我嘗試編譯,我收到了一系列錯誤(其中14),所有標註同樣的事情:錯誤:函數定義標記爲dllimport

function *insert call here* definition is marked dllimport

文件本身是如下─好奇的是,在該文件中,只IFeatureObserver(),IFeatureObserver()和IFeatureObserver(常量IFeatureObserver &)正在觸發該錯誤; FeatureChanged()在編譯期間不會出錯。

#ifndef AVT_VMBAPI_IFEATUREOBSERVER_H 
#define AVT_VMBAPI_IFEATUREOBSERVER_H 

#include <VimbaCPP/Include/VimbaCPPCommon.h> 
#include <VimbaCPP/Include/SharedPointerDefines.h> 
#include <VimbaCPP/Include/Feature.h> 
#include <vector> 

namespace AVT { 
namespace VmbAPI { 

class IFeatureObserver 
{ 
    public: 

    IMEXPORT virtual void FeatureChanged(const FeaturePtr &pFeature) = 0; 

    IMEXPORT virtual ~IFeatureObserver() {} 

    protected: 
    IMEXPORT IFeatureObserver() {} 
    IMEXPORT IFeatureObserver(const IFeatureObserver&) { /* No copy ctor */ } 
}; 
typedef std::vector<IFeatureObserverPtr> IFeatureObserverPtrVector; 

}} // namespace AVT::VmbAPI 

#endif 

在追蹤IMEXPORT的源代碼後,我在.h文件中找到它。

#if defined (_WIN32) 
    #if defined AVT_VMBAPI_CPP_EXPORTS   // DLL exports 
     #define IMEXPORT __declspec(dllexport) 
    #elif defined AVT_VMBAPI_CPP_LIB   // static LIB 
     #define IMEXPORT 
    #else          // import 
     #define IMEXPORT __declspec(dllimport) 
    #endif 
#elif defined (__GNUC__) && (__GNUC__ >= 4) && defined (__ELF__) 
    #define IMEXPORT 
#elif defined (__APPLE__) 
    #define IMEXPORT 
#else 
    #error Unknown platform, file needs adaption 
#endif 

我目前在Qt中,一個Win7-32​​位計算機上,而據我可以告訴IMEXPORT被定義爲__declspec(dllimport的)。

想法?提前致謝!

+0

問題是,由於某些原因,這些函數被定義(有機構),但他們被標記爲從.dll導入。它看起來可能是庫中的一個bug,因爲它可能適用於靜態構建。你*可以*嘗試刪除函數體並離開原型,但是這對我來說會感覺骯髒和錯誤。也許嘗試鏈接靜態? –

回答

2

您應該在makefile或VS項目中定義宏AVT_VMBAPI_CPP_EXPORTS。這種方式IMEXPORT被定義爲dllexport這個庫和DLL導入時,其他庫/應用程序使用它。

順便說一句,將這個屬性添加到類本身並不是每個函數都更清晰。

class IMEXPORT IFeatureObserver { 
public: 
    virtual void FeatureChanged(const FeaturePtr &pFeature) = 0; 
}; 
+0

對於VC++'IMEXPORT'應該放在'class'和類名之間。 –

+0

@CaptainObvlious:改正,10倍。 – egur

+0

這似乎已清除它。非常感謝! 當我編寫DLL時,我會爲將來保留該屬性。 –