一、前言
在eclipse中已经成功引入了wireshark的dll,但是后面调用函数的时候发生了异常,原因很不好查,貌似对于c来说,vs对于dll的提示更多一些,所以希望采用vs进行dll的导入和测试工作。
二、遇到问题
一)第一个阶段遇到问题glib的都引入报错,错误现象是连接失败找不到_g_printf()
代码简单示例如下:
// vsglibtest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
#include <glib/gprintf.h>
int main()
{
gchar ch[128];
g_sprintf(ch, "hello world\n");
printf("%s", ch);
getchar();
return 0;
}
解决办法:
1)看下vs stdio的编译后程序的版本,一定要和glib的dll相互匹配,比如生成程序是64位的,但是dll是32位的就会有这个问题。
注意点:
1)需要将dll文件拷贝到可执行文件夹下面。
2)引入的lib有(有些没有用我暂时也引入了)
glib-2.0.lib
gobject-2.0.lib
gmodule-2.0.lib
libgmodule-2.0.dll.a
libglib-2.0.dll.a
libgobject-2.0.dll.a
3)对于动态库来说,有个配合的.lib这个文件的内容为导出的函数入口检测,这个文件可以通过*.def文件生成,具体可以查看:
由def生成lib的连接
二)无法定位程序入口点xxx于动态链接库
解决办法:
1)其实这个问题我还没有解决,目前的理解是这样子的,动态库中.lib是定位程序入口点的,
dll是实际内容,目前有一个这个问题被我解决了,就是引入相关的.lib,当时解决的lib是:
g_module_open_utf8 这个我是通过引入
gmodule-2.0.lib
libgmodule-2.0.dll.a
这两个库来解决的,注意顺序不能错。
2)最终解决是我的glib-2.0-0.dll的版本有问题,通过dll的工具查看,确实我那个dll是没有相关的函数的,
真坑啊,奇怪的是使用eclipse就没报这个问题。
也许后面就顺利了:)。
最终依赖的:
glib-2.0.lib
gobject-2.0.lib
gmodule-2.0.lib
libglib-2.0.dll.a
libgobject-2.0.dll.a
libgmodule-2.0.dll.a
wsutil.lib
wireshark.lib
wiretap.lib
wscodecs.lib
注意glib-2.0-0.dll是从wireshark编译的时候依赖的:G:\wireshark-win64-libs-2.6\gtk2\bin拷贝的。