今天不明白为什么大家在写动态库的时候,都要用到
#ifdef @@@@API #else #define @@@@ __declspec(dllimport) #endif
为什么明明是导出动态库,还要用到dllimport。
是因为别人用到我们提供的动态库的时候,会包含这个头文件,然后他们不会define @@@@API,所以会跳到else里面,他们需要导入,正好。
摘抄:
C++的dllexport和dllimport:
__declspec(dllexport)
声明一个导出函数,是说这个函数要从本DLL导出。我要给别人用。一般用于dll中省掉在DEF文件中手工定义导出哪些函数的一个方法。
__declspec(dllimport)
声明一个导入函数,是说这个函数是从别的DLL导入。我要用。一般用于使用某个dll的exe中 不使用__declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport)使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用__declspec(dllimport) 才能导入 DLL 中使用的变量。