当前位置:C++技术网 > 资讯 > dll库没有生成lib文件

dll库没有生成lib文件

更新时间:2017-05-04 22:44:49浏览次数:1+次


你好,我是通过控制台设置的dll库工程,

头文件是这样的,没有设置def文件,一直没有生成lib文件。不知道怎么回事,一直百度也没有找到解决办法。

下面是头文件

#ifdef KEY_MOUSE_HOOK_EXPORTS
#define KEY_BORD_API __declspec(dllexport)
#else
#define KEY_BORD_API __declspec(dllimport)
#endif


#define HM_KEY  WM_USER + 101
#define HM_MOUSE WM_USER + 102
// 声明要导出的函数
//BOOL KEYHOOKLIB_API WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId = 0, HWND hWndCaller = NULL);

KEY_BORD_API int WINAPI SetKeyHook(int bInstall, unsigned long dwThreadId = 0, int hWndCaller = NULL);



C++技术网会员解答:

    您好,感谢您对C++技术网的支持与信任。

    如果DLL有导出函数,是会同时生成dll和对应的导入库lib文件的。你这里没有生成lib文件,是因为没有导出函数。

    不过从前面几行可以看出,你是有心要导出的,但是却疏忽了宏的用法。在要导出的函数SetKeyHook的声明前,确实加了一个要导出函数的说明。不过因为这里并没有真正定义宏

KEY_MOUSE_HOOK_EXPORTS
   导致KEY_BORD_API被定义为__declspec(dllimport),就成了导入,而不是导出。自然就不对了。这个问题是宏使用不对引起的。如果你不修改代码,那么在最开始的#ifdef前加上KEY_MOUSE_HOOK_EXPORTS的定义即可。如果仅修改代码,那么调换dllexport和dllimport的位置就行了。

    如果宏的使用给你造成了混乱,那么你就直接将__declspec(dllexport)加在被导出函数的前面,就可以测试出来了。

    这里涉及到找问题的思路,我大概说一下,供你后续调试时参考。

    这里出现的问题表面上是没有产生lib文件。我们要分析没有产生lib文件的原因,那就是没有真正导出函数。没有真正导出函数,那么就是__declspec(dllexport)使用不对。我们要检查被导出函数前的这个修饰符是否正确。然后我们看到前面是一个宏代替的。那么这个宏就是问题的关键。先不直接去看宏,可能宏的定义比较复杂,那么你可以先直接用__declspec(dllexport)来写死。当遇到问题的时候,临时写死,可以很好的测试问题。此时不要将宏和修饰符混在一起。将修饰符写死,就没有宏的问题了。此时如果没有问题了,一下子就确定了是宏的问题。如果还有问题,那么和宏的关系就不是百分之百的了。

    我们这里可以确定,写死后,就可以正常生成lib文件。说明就是宏的问题。然后我们再将焦点转移到宏的使用上。首先就要看宏怎么定义的,然后怎么使用的。我们这里就可以看到宏被定义为两种了。所以,我们要根据条件来看宏的值。这里显然在

#ifdef KEY_MOUSE_HOOK_EXPORTS
    前,并没有定义KEY_MOUSE_HOOK_EXPORTS,所以宏就被定义为了第二种。而这种就刚好不对,所以就出问题了。

    所以说,调试的时候,你看到的问题,不一定是真正的问题,需要一层层的分析才行。如果你在某一层总是找不到问题,那就尝试着往其他层次来分析。按照前面分析的思路,都是一步步分析得到的。至于说第一个步骤,即没有产生lib的原因,网上一查就知道了。所以,只要慢慢去分析,其实都好解决。

    再遇到问题,多尝试一下一步步的严密的推理吧,这样可以很快的形成严谨的逻辑思维,可以大大提高调试的效率。