SFML 2.4.2 for Visual C++ 2017 使用 SFML 的 2015 构建

SFML 2.4.2 for Visual C++ 2017 using the 2015 build of SFML

所以我正在尝试编写一些与网络相关的代码,特别是使用 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;
}

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

Severity Code Description Project File Line Suppression State Error LNK2019 unresolved external symbol "public: virtual __thiscall sf::Socket::~Socket(void)" (??1Socket@sf@@UAE@XZ) referenced in function "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

Error LNK2019 unresolved external symbol "public: __thiscall sf::TcpSocket::TcpSocket(void)" (??0TcpSocket@sf@@QAE@XZ) referenced in function "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

Error LNK2019 unresolved external symbol "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) referenced in function "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

Error LNK2019 unresolved external symbol "public: void __thiscall sf::TcpSocket::disconnect(void)" (?disconnect@TcpSocket@sf@@QAEXXZ) referenced in function "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

Error LNK2019 unresolved external symbol "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) referenced in function "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

Error LNK2001 unresolved external symbol "public: static class sf::Time const sf::Time::Zero" (?Zero@Time@sf@@2V12@B) PortScannerWin32 c:\Users\James\documents\visual studio 2017\Projects\PortScannerWin32\PortScannerWin32\PortScanner.obj 1
Warning LNK4272 library machine type 'x64' conflicts with target machine type '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

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

有人知道出了什么问题吗?我会说明显的答案是 VS 2017 中使用的是 2015,但很多论坛都说它没有问题,因为 SFML 2015 中的更新允许这样做。

您没有链接到正确的图书馆平台。

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

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

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

您正在使用的 类 的头文件包括 (SFML/Network.hpp) "promises" 个实现。链接器的工作是将 "promises" 与包含在静态库 (.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,以便库的 "bitness" 与您的可执行文件的平台值相匹配。这是本机代码,因此生成的代码必须适用于相同的体系结构。

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