好久没有开发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