“extern”和“__declspec(dllimport”)之间有什么区别/关系?我发现有时需要同时使用它们,有时一个就足够了。我说的对吗:“extern”用于静态链接库,"__declspec(dllimport)"用于DLL(动态链接库),对于各自的链接类型,两者实际上都做了相同的工作,在使用导入库(有助于与dll链接的小.lib文件)时,您需要同时使用这两者吗? 最佳答案 extern表示实体具有外部链接,即在其翻译单元(C或CPP文件)之外可见。这意味着相应的符号将被放置在目标文件中,因此如果该目标文件成为静态库的一部分
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Windows&C++:extern&__declspec(dllimport)Why/whenis__declspec(dllimport)notneeded?我想写一个DLL项目。这个项目包括几个DLL。他们依赖。我定义了一些宏,如下所示:#ifdefMYDLL_DECL1#defineDLL_DECL__declspec(dllexport)#else#defineDLL_DECL__declspec(dllimport)#endif我为每个模块定义了MYDLL_DECL1...MYDLL_DECLn。
为x86构建应用程序时,以下代码可以正常工作:#ifdefined_WIN32#defineLIB_PRE__declspec(dllexport)#elifdefined__unix__#defineLIB_PRE#else#defineLIB_PRE__declspec(dllexport)#endif但是对于GCC(ARM)给出了一个错误。我发现__declspec(dllexport)不会在GCC上工作。如果是这样,我应该为GCC(ARM)使用什么?编辑:它在许多类(class)中都有使用。例如:classCJsonValueString:publicCJsonValue{pr
我对VisualStudio2005及更高版本中的DLL构建/链接有疑问。基本上我的理解和经验是这样的:为了构建一个DLL,我指定了项目属性来构建一个DLL,然后我在我想从DLL中公开公开的任何函数或成员前面加上__declspec(dllexport)。构建项目将产生一个DLL、一个库和一个可以作为API或其他东西部署的头文件。另一方面,要让您的其他已编译的可执行应用程序动态链接到DLL并使用其功能,您只需让您的可执行项目包含头文件并链接到DLL时创建的小lib文件被建。只要编译后的应用程序可以找到DLL,一切就可以了。这是我的经验,也是MicrosoftDLL构建教程如何描述MSD
我有时会看到关键字以两个下划线开头,有时则只有一个。有区别吗? 最佳答案 我相信_declspec是同一个Microsoft特定关键字__declspec的旧名称。从C++标准的角度来看,对于这样的扩展,两个下划线比一个下划线更正确。这是根据17.4.3.1.2/1:Certainsetsofnamesandfunctionsignaturesarealwaysreservedtotheimplementation:Eachnamethatcontainsadoubleunderscore(__)orbeginswithanunde
我正在为第三方应用程序编写DLL。主要软件工程师提到该应用程序使用__cdecl(/Gd)调用约定。我需要确保使用它。另外,第三方提供给我一个C++DLL骨架,导出函数如下:#ifdef_EXPORTING#defineDECLSPEC__declspec(dllexport)#else#defineDECLSPEC__declspec(dllimport)#endif#ifdef__cplusplusextern"C"{#endifDECLSPECintICD_Create(char*id);........我有点迷茫。为什么使用__declspec约定而不是__cdedl导出函数?
我需要用C++创建一些共享库,我使用linux作为我的开发者操作系统。我知道如果我想通过dlsym/LoadLibrary加载它们,我需要让符号可见。所以在Linux中,我所有的符号都遵循这种模式:extern"C"[[gnu::visibility("default")]]voidf();我在启用C++11的情况下使用了clang,并且能够在我的主机程序中加载f。当我转移到Windows时,我使用启用了C++11的GCC4.8.2,并且该模式在Windows机器上也适用于LoadLibrary。(我需要使用C++11来实现新的属性语法)。我知道在Windows上我需要使用__decl
我正在开发一个COMdll并尝试使用__declspec(dllexport)导出DllGetClassObject()方法。这是我的声明:extern"C"HRESULT__declspec(dllexport)__stdcallDllGetClassObject(REFCLSIDrclsid,REFIIDriid,void**ppv)但我一直收到这个错误:errorC2375:'DllGetClassObject':redefinition;differentlinkage所以我尝试检查所有出现的DllGetClassObject定义。从而在ObjBase.h中找到了如下内容。ST
或者,使用__declspec(novtable)是否有任何其他已知的负面影响?我似乎找不到任何问题的引用。 最佳答案 MSCV使用每个对象一个vptr,每个类一个vtbl来实现OO机制,例如RTTI和虚函数。因此,当且仅当vptr已正确设置时,RTTI和虚函数才能正常工作。struct__declspec(novtable)B{virtualvoidf()=0;};structD1:B{D1(){}//aftertheconstructionofD1,vptrwillbesettovtblofD1.};D1d1;//afterdh
给定一个包含以下类的DLL:#defineDLLAPI__declspec(...)classDLLAPIBase{public:virtualvoidB();};classDerived:publicBase{public:virtualvoidB();virtualvoidD();};即使“DLLAPI”关键字未应用于类定义(至少,不是直接),我的“派生”类是否在dll外部可见?“D()”函数是否可见?谢谢 最佳答案 Derived类不会被您的DLL导出。类不继承导出。也将DLLAPI添加到其中。另请注意,类成员默认为私有(pr