http://msdn.microsoft.com/en-us/library/9h658af8.aspxMSDN说我可以使用__declspec(dllexport)从库中导出函数,但是如何将这个库加载到我的可执行文件中?我在DLL中有一个导出函数:__declspec(dllexport)voidmyfunc(){}现在我想在我的可执行文件中使用它:__declspec(dllimport)voidmyfunc(void);但是我的程序如何知道在哪里可以找到这个函数呢? 最佳答案 这是编译器/链接器的工作,只要你自动完成在链接器
我的项目是通过几个静态库构建的,这些静态库应该链接到主dll库,因此获得了一个dll。使用__declspec(dllexport)属性不会导致静态库的指定函数出现在dll中,库根本没有与dll链接。然后我尝试将每个库构建为共享库,以获得导出函数的正确名称,并基于它们创建.def文件。使用.def文件会导致结果。在我的情况下,__declspec(dllexport)和.def-file应该同等对待吗?是否可以从源代码生成.def文件?由于我有C++代码,由于API中的修饰和存在类,我无法自己编写.def文件,因此上述使用临时生成的dll的方法与生产不一致。更新我想详细解释一下我的项目
我的项目是通过几个静态库构建的,这些静态库应该链接到主dll库,因此获得了一个dll。使用__declspec(dllexport)属性不会导致静态库的指定函数出现在dll中,库根本没有与dll链接。然后我尝试将每个库构建为共享库,以获得导出函数的正确名称,并基于它们创建.def文件。使用.def文件会导致结果。在我的情况下,__declspec(dllexport)和.def-file应该同等对待吗?是否可以从源代码生成.def文件?由于我有C++代码,由于API中的修饰和存在类,我无法自己编写.def文件,因此上述使用临时生成的dll的方法与生产不一致。更新我想详细解释一下我的项目
在我的VS2010拷贝中,stdlib.h包含(第353-355行)_CRTIMP__declspec(noreturn)void__cdeclexit(_In_int_Code);_CRTIMP__declspec(noreturn)void__cdecl_exit(_In_int_Code);_CRTIMPvoid__cdeclabort(void);我觉得奇怪的是abort()上没有noreturn注释。有谁知道这是什么原因?是bug吗?编辑:在VS2008中,它是相同的,但stdlib.h的第371-373行缺少noreturn注释正在触发errorC4716.进一步引用:C+
在我的VS2010拷贝中,stdlib.h包含(第353-355行)_CRTIMP__declspec(noreturn)void__cdeclexit(_In_int_Code);_CRTIMP__declspec(noreturn)void__cdecl_exit(_In_int_Code);_CRTIMPvoid__cdeclabort(void);我觉得奇怪的是abort()上没有noreturn注释。有谁知道这是什么原因?是bug吗?编辑:在VS2008中,它是相同的,但stdlib.h的第371-373行缺少noreturn注释正在触发errorC4716.进一步引用:C+
我想定义一个基于dll导出类的派生类。基类在ProjectA中定义,派生类在ProjectB中。首先,在项目A中,定义了预处理器MYDLL_BUILD。我使用头文件来指定导出/导入:#if!defined(MYDLL_BUILD)#pragmacomment(lib,"myDll.lib")#endif#ifdefined(MYDLL_BUILD)#defineMYDLL_API__declspec(dllexport)#else#defineMYDLL_API__declspec(dllimport)#endif然后我定义基类:classMYDLL_APIDllObject{publ
我想定义一个基于dll导出类的派生类。基类在ProjectA中定义,派生类在ProjectB中。首先,在项目A中,定义了预处理器MYDLL_BUILD。我使用头文件来指定导出/导入:#if!defined(MYDLL_BUILD)#pragmacomment(lib,"myDll.lib")#endif#ifdefined(MYDLL_BUILD)#defineMYDLL_API__declspec(dllexport)#else#defineMYDLL_API__declspec(dllimport)#endif然后我定义基类:classMYDLL_APIDllObject{publ
在ELF目标上,如果我有classFoo并且我通过class__attribute__((visibiility("default")之类的声明赋予它default可见性)))Foo,然后我可以通过使用__attribute__((visibility("hidden")).这对于不应构成ABI一部分的内联方法很有用,因此如果在构建定义classFoo的库时发出它们,它们不会被导出,或者对于privateclassFoo中的成员或类型也不应构成其ABI的一部分。但是,在Windows上,似乎没有办法实现这一点。虽然未修饰的classFoo自动为DLL私有(private),但一旦修饰为
在ELF目标上,如果我有classFoo并且我通过class__attribute__((visibiility("default")之类的声明赋予它default可见性)))Foo,然后我可以通过使用__attribute__((visibility("hidden")).这对于不应构成ABI一部分的内联方法很有用,因此如果在构建定义classFoo的库时发出它们,它们不会被导出,或者对于privateclassFoo中的成员或类型也不应构成其ABI的一部分。但是,在Windows上,似乎没有办法实现这一点。虽然未修饰的classFoo自动为DLL私有(private),但一旦修饰为
“extern”和“__declspec(dllimport”)之间有什么区别/关系?我发现有时需要同时使用它们,有时一个就足够了。我说的对吗:“extern”用于静态链接库,"__declspec(dllimport)"用于DLL(动态链接库),对于各自的链接类型,两者实际上都做了相同的工作,在使用导入库(有助于与dll链接的小.lib文件)时,您需要同时使用这两者吗? 最佳答案 extern表示实体具有外部链接,即在其翻译单元(C或CPP文件)之外可见。这意味着相应的符号将被放置在目标文件中,因此如果该目标文件成为静态库的一部分