C++编译错误

4
我正在开发一个防火墙应用程序,该应用程序可在Windows XP上运行。
为此,我正在创建一个 dll 文件,可以在 C# 文件中使用。
对于Vista或更高版本,我使用了这段代码,但它无法编译。我的win sdk 2008出现了以下错误:

Error 19 error LNK2019: 在函数 "private: unsigned long __thiscall PacketFilter::CreateDeleteInterface(bool)" (?CreateDeleteInterface@PacketFilter@@AAEK_N@Z) 中引用了未解析的外部符号 _FwpmEngineOpen0@20 PacketFilter.obj FirewallVista ".

这一定是某个项目属性设置问题,因为我知道所有的库文件都被正确导入了。

1
这是一个链接错误。确保将必要的库与项目进行链接。 - soulseekah
正如我告诉过你的那样,我正在使用来自Code Project的代码。 - Barun
1
Barun:缺失的引用来自于codeproject代码。您没有包含所需的一些codeproject代码,或者需要导入一个库。 - Billy ONeal
2
@Barun,你把链接器和编译器搞混了。Intellisense能正常工作意味着它包含了正确的头文件,这使得编译器很高兴。但它找不到正确的库,导致了链接器错误。既然你想要C#代码,我怀疑试图让C++代码工作会让你不开心。要么使用Code Project讨论线程,要么尝试使用其他可以为你构建的包装库。 - Kate Gregory
@Kate Gregory:我不需要C#代码。如果它能像C++那样工作,会更有帮助。 - Barun
显示剩余3条评论
3个回答

6
看起来你正在尝试从codeproject编译简单的WFP项目。上面的人可能不理解问题,但答案是:
1. 找到链接器失败的第一个函数,并在MSDN上找到它,例如FwpmEngineOpen0,然后找到它需要连接的库并将其添加到项目属性/链接器/输入/附加依赖项中 2. 实际上,在示例中,还有另一个失败链接的函数UuidCreate 长话短说:
1. 创建纯Win32控制台应用程序(我使用VS2012)并构建它-确保它可行 2. 将头文件(PacketFilter.h)添加到项目中 3. 用(PacketFilter.cpp)内容替换主源文件,但不要删除文件顶部的“stdafx.h”包含 4. 将以下库添加到链接器部分(如上所述)
Fwpuclnt.lib Rpcrt4.lib
构建和运行应用程序(您可能还需要将字符集更改为多字节)。
您将不得不修改源中的IP地址,以使示例正常工作。我选择了本地IP地址并执行了以下操作 ping -n 100 192.168.100.200
看到ping返回,启动exe文件,然后看到ping无法到达目的地(超时)-例如,防火墙正在工作。然后按任意键停止防火墙并再次看到ping到达目的地。
我本来会发布codeproject页面的链接,但由于我少于10个积分-我不能:-P
Google搜索:“使用Vista的Windows Filtering Platform APIs构建防火墙”
希望这可以帮助任何尝试构建此示例的人。

哇,楼主应该把这个标记为答案。解决方案在第四步。 - laycat
根据MSDN,FwpmEngineOpen0(...)仅适用于Windows VistaWindows Server 2008及以上版本,但OP询问关于Win-XP的情况。 - Top-Master

2
您缺少一个库引用。请检查您是否已导入了代码所需的.lib文件。
编辑:缺失的导入是来自您所谈论的库本身。这可能表明您忘记导入该实际库的.lib,或者您需要将该项目的.cpp文件附加到您自己的项目中。换句话说,您需要更多的头文件。
此外,如果您正在使用.NET,请考虑使用普通的Vista防火墙API,因为它已经作为COM coclass公开,.NET可以直接与之通信。

@Barun:你需要的位都在System.Runtime.InteropServices中。从这里开始。 - Billy ONeal
这一定是某个项目属性设置的问题。 - Barun
@Barun:我们不是通灵者。错误信息是链接器说“我找不到那个函数/变量。”如果没有看到你的确切机器,我们将无法解决这个问题,因为问题不在于你的代码,而是在于你的编译器/项目设置。任何人能给你的唯一提示就是“你需要配置你的编译器/项目,以便链接器可以找到它所需的函数/变量”。 - Billy ONeal
智能感知正在该函数上工作。但它没有找到链接库。我想知道原因是什么。 - Barun
@Barun:你看到@Kate在你的问题上的评论了吗?Intellisense不是程序有效性的验证器,工具链(编译器/链接器)才是。 - Billy ONeal
显示剩余2条评论

0
在解决方案资源管理器中右键单击项目名称,选择属性。然后打开链接器 -> 输入。在附加依赖项旁边的下拉菜单中选择<编辑>。然后在顶部文本框中输入以下内容:
%(AdditionalDependencies)
$(DDK_LIB_PATH)\NTOSKrnl.lib
$(DDK_LIB_PATH)\FwpKClnt.lib
$(DDK_LIB_PATH)\NetIO.lib
$(DDK_LIB_PATH)\NDIS.lib
$(DDK_LIB_PATH)\WDMSec.lib
$(SDK_LIB_PATH)\UUID.lib

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接