【问题标题】:SFML 2.4.2 for Visual C++ 2017 using the 2015 build of SFMLSFML 2.4.2 for Visual C++ 2017 使用 SFML 2015 版本
【发布时间】:2017-11-10 14:03:11
【问题描述】:

所以我正在尝试编写一些与网络相关的代码,特别是使用 SFML 的端口扫描器。我正在运行 VS 2017 并下载了 2015 年的 SFML 版本,但是人们说这应该适用于 2017 年。

到目前为止,我尝试查看该库是否正常工作的演示代码是:

#include <iostream>
#include <SFML/Network.hpp>
#include <string>

using namespace std;

bool port_is_open(const string& address, int port) {
    sf::TcpSocket socket;
    bool open = (socket.connect(sf::IpAddress(address), port) == sf::Socket::Done);
    socket.disconnect();
    return open;
}

int main() {
    cout << "Enter IP number: ";
    string address;
    cin >> address;

    cout << "Enter Port number: ";
    int port;
    cin >> port;

    if (port_is_open(address, port)) {
        cout << "Port " << port << ": OPEN" << endl;
    }
    else {
        cout << "Port " << port << ": CLOSED" << endl;
    }


    return 0;
}

但如果这行得通,我就不会在这里了。

严重性代码描述项目文件行抑制状态 错误 LNK2019 无法解析外部符号“public: virtual __thiscall sf::Socket::~Socket(void)” (??1Socket@sf@@UAE@XZ) 在函数“public: virtual __thiscall sf::TcpSocket::~TcpSocket”中引用(void)" (??1TcpSocket@sf@@UAE@XZ) PortScannerWin32 c:\Users\James\documents\visual studio 2017\Projects\PortScannerWin32\PortScannerWin32\PortScanner.obj 1

在函数“bool __cdecl port_is_open(class std::basic_string,class std::allocator > const &,int)" (?port_is_open@@YA_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) PortScannerWin32 c :\Users\James\documents\visual studio 2017\Projects\PortScannerWin32\PortScannerWin32\PortScanner.obj 1

错误 LNK2019 无法解析外部符号“public: enum sf::Socket::Status __thiscall sf::TcpSocket::connect(class sf::IpAddress const &,unsigned short,class sf::Time)” (?connect@ TcpSocket@sf@@QAE?AW4Status@Socket@2@ABVIpAddress@2@GVTime@2@@Z) 在函数“bool __cdecl port_is_open(class std::basic_string,class std::allocator > const &,int)”中引用(?port_is_open@@YA_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) PortScannerWin32 c:\Users\James\documents\visual studio 2017 \Projects\PortScannerWin32\PortScannerWin32\PortScanner.obj 1

在函数“bool __cdecl port_is_open(class std::basic_string,class std::allocator > const &,int)" (?port_is_open@@YA_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) PortScannerWin32 c :\Users\James\documents\visual studio 2017\Projects\PortScannerWin32\PortScannerWin32\PortScanner.obj 1

错误 LNK2019 无法解析外部符号“public: __thiscall sf::IpAddress::IpAddress(class std::basic_string,class std::allocator > const &)”(??0IpAddress@sf@@QAE@ABV?$basic_string @DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 在函数“bool __cdecl port_is_open(class std::basic_string,class std::allocator > const &, int)" (?port_is_open@@YA_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) PortScannerWin32 c:\Users\James\documents\视觉工作室 2017\Projects\PortScannerWin32\PortScannerWin32\PortScanner.obj 1

错误 LNK2001 无法解析外部符号“public: static class sf::Time const sf::Time::Zero”(?Zero@Time@sf@@2V12@B) PortScannerWin32 c:\Users\James\documents\visual工作室 2017\Projects\PortScannerWin32\PortScannerWin32\PortScanner.obj 1
警告 LNK4272 库机器类型“x64”与目标机器类型“X86”冲突 PortScannerWin32 D:\SFML-2.4.2\lib\sfml-network-d.lib 1

Error LNK1120 6 unresolved externals PortScannerWin32 c:\users\james\documents\visual studio 2017\Projects\PortScannerWin32\Debug\PortScannerWin32.exe 1

这些都是我的错误,老实说,我真的一点头绪都没有。我按照教程逐字逐句输入了依赖项等。

有人知道出了什么问题吗?我想说显而易见的答案是 2015 年在 VS 2017 中使用,但很多论坛都表示它可以正常工作,因为 SFML 2015 中的更新允许这样做。

【问题讨论】:

标签: c++ network-programming visual-studio-2017 sfml


【解决方案1】:

我对这个库一无所知,但这些似乎是非常标准的链接器错误。将 VS 2017 (Platform Toolset v141) 与使用 VS 2015 (Plaform Toolset v141) 编译的库链接应该没有问题。微软在 VS 2015 和 2017 的编译器之间保持了二进制兼容性,这允许在同一个可执行文件中混合使用任何一种编译器编译的代码。

您的头文件包括 (SFML/Network.hpp) 您正在使用的类的“承诺”实现。链接器的工作是将“承诺”与包含在静态库 (.lib) 中的实际实现进行匹配,并将它们组合在一起以创建您的 exe。

注意最后一个警告:

Warning LNK4272 library machine type 'x64' conflicts with target machine type 'X86' PortScannerWin32 D:\SFML-2.4.2\lib\sfml-network-d.lib 1

作为第一步,我会将 Visual Studio 中项目的平台值更改为 x64,因此库的“位数”与可执行文件的“位数”相匹配。这是本机机器码,所以生成的代码必须是相同的架构。

请注意,更改此设置时,您可能需要设置项目属性,例如包含和库路径,以及链接器输入,以便您的代码编译。您可以使用项目属性表将 x64 值设置为 x86 平台中的值。

【讨论】:

    【解决方案2】:

    您没有链接到正确的库平台。

    警告 LNK4272 库机器类型“x64”与目标机器类型“X86”PortScannerWin32 D:\SFML-2.4.2\lib\sfml-network-d.lib 1 冲突

    这表明您正在链接一个 64 位库,而您的项目是 32 位的。确保使用正确的库,或更新您的项目以将其构建为 64 位项目。

    【讨论】:

      猜你喜欢
      • 2019-08-04
      • 1970-01-01
      • 2020-09-24
      • 2018-05-27
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多