visual studio 2008编译libnids的问题

来源:互联网 发布:手机蒙文软件 编辑:程序博客网 时间:2024/05/20 11:26

好久没有开发c++程序了,感觉很不适应。

由于需要审计网络的行为,所以找了一个libnids的demo,在visual studio 2008下编译,感觉很不习惯,对工具也不熟悉,花了一天时间在别人的帮忙下终于编译通过了,再次记录一下。

visual studio 2008环境配置。后面都简称vs9.

在开发的时候,首先是想到的是要配置环境变量,比如引用那些类库,引用哪些头文件等等。

在vs里面有两个地方可以配置:

1、全局配置:工具-》选项-》项目和解决方案-》vc++ 目录右边有一个下拉列表,包括可执行文件,包含文件,库文件等等,在里面添加就可以了。

2、项目配置:项目->属性->配置属性->链接器->常规->附加库目录


理解解决方案和项目的区别:

对这部分内容我也琢磨了一会,解决方案可以理解为一个大的工程,里面可以分为多个可执行的模块,或者是链接库。这些内容在一个解决方案里面体现,比较好直观的展示项目的内容。


好,现在还是讲引用libnids产生的问题了。

1、预处理:项目->属性->配置属性-》c/c++-》预处理器-》预处理器定义:写上WIN32;_DEBUG;_CONSOLE。

2、项目包含的lib库,和上面的配置的区别是,上面的配置表示编译器可以找到位置,这里的配置是此项目需要的lib库,位置在项目->属性->配置属性->链接器->输入

附加依赖项:libnids.lib wpcap.lib libnids-debug.lib libpcap.lib ws2_32.lib

还要在忽略特定库里面写上:LIBCMT.lib,不然编译会包: LIBCMT.lib(close.obj) : error LNK2005: __close 已经在 LIBCD.lib(close.obj) 中定义

Libcd.lib  DEBUG 版本 libc.lib  Release 版本得


还需要在cpp里面的include下面添加:

extern "C" {   FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]}; }

否则会提示:unresolved external symbol __iob


忽略libcmt.lib he extern "c" 这两个地方的配置后来研究和编译的方式有关系。

在mfc的使用中选择 :静态库中使用MFC就可以了。


原理:

VS2008,项目——属性——配置属性——C/C++——代码生成:他有/MT,/MTd,/Md,/MDd四个选项,你必须让所有使用的库都使用相同的配置,否则就会有相应的提示,甚至可能会出现无法解析的函数。有时我们使用的库不是自己可以控制的,那么就只能把工程属性设置成河你使用的库相同的选项。

通常用多线程调试MTd。

错误 1 error LNK2005: _free 已经在 libcmtd.lib(dbgheap.obj) 中定义         MSVCRT.lib

错误 2 error LNK2005: _malloc 已经在 libcmtd.lib(dbgheap.obj) 中定义     MSVCRT.lib 

 

如果有一堆的重定义错误发生在同一个lib中,而且跟它冲突的也是同一个lib,那么这个两个lib的功能应该是一样的,可以2选一,只要在“忽略特定的库”内填入需要忽略的库。

 

项目属性-配置属性-链接器-输入-忽略特定的库:libcmtd.lib

详见:http://blog.csdn.net/pgmsoul/article/details/4203941


错误例子及分析:

 error LNK2019: 无法解析的外部符号 _inet_ntoa@4 ,该符号在函数 _adres 中被引用

表示缺少ws2_32.lib

libnids.lib(libnids.obj) : error LNK2019: 无法解析的外部符号 _pcap_datalink ,该符号在函数 _nids_init 中被引用 

表示缺少wpcap.lib

error LNK2019: 无法解析的外部符号 _nids_run ,该符号在函数 _main 中被引用

表示缺少libnids.lib

原创粉丝点击