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 平台中的值。
所以我正在尝试编写一些与网络相关的代码,特别是使用 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 1Error 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 平台中的值。