2017-06-08 20 views
0

私はいくつかのネットワーク関連のコード、特にSFMLを使用するポートスキャナを記述しようとしています。私は人々が、これは試してみて、ライブラリが動作しているかどうかを確認するために、これまでに2017年SFML 2.4.2 SFMLの2015ビルドを使用するVisual C++ 2017用

私のデモコードで動作するべきであると述べているしかし2015用にビルドVS 2017を実行していますし、SFMLをダウンロードしたある:

#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未解決の外部シンボル "パブリック:仮想__thiscall SF ::ソケット::〜ソケット(無効)"(?? 1Socket @ SF @@ UAE @ XZ)は、参照します関数 "public:virtual __thiscall sf :: TcpSocket ::〜TcpSocket(void)"(1TcpSocket @ sf @@ UAE @ XZ)PortScannerWin32 c:\ Users \ James \ documents \ visualスタジオ2017 \ Projects \ PortScannerWin32 \ PortScannerWin32 \ PortScanner.obj 1

エラーLNK2019未解決の外部シンボル "パブリック:__thiscall SF :: TcpSocket :: TcpSocket(無効)"(?? 0TcpSocket @ SF @@ QAEする@ XZ)関数で参照「BOOL __cdecl port_is_open(クラスstd :: basic_string、クラス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関数 "bool __cdecl port_is_open(class std)で参照されている@ TcpSocket @ sf @@ QAE?AW4Status @ Socket @ 2 @AVIVIAddress @ 2 @ GVTime @ 2 @@ Z) :: basic_string、クラス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未解決の外部シンボル "bool __cdecl port_is_open(class std :: basic_string、TcpSocket :: default_string、クラスの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、クラスstd :: allocator> const &) "(?? 0IpAddress @ sf @@ QAE @ ABV?$ basic_string @ DU?char_traits @ D @ std @@ V?$ allocator @D @ 2 @ std @@@ Z )関数 "bool __cdで参照される(デフォルトでは、クラスstd :: allocator> const &、int) "と書かれています。 @ std @@ H @ Z)PortScannerWin32 c:\ Users \ James \ documents \ visualスタジオ2017 \ Projects \ PortScannerWin32 \ PortScannerWin32 \ PortScanner.obj 1

エラーLNK2001未解決の外部シンボル「public:static class sf :: Timeポートスキャン・ウィンターズ・オブ・ザ・ナショナル・インフォメーション・マネジメント・ジャパン株式会社(本社:東京都渋谷区、代表取締役社長:ライブラリマシンタイプ 'x64'はターゲットマシンタイプ 'X86'と競合します。PortScannerWin32 D:¥SFML-2.4.2¥lib¥sfml-network-d.lib 1

エラーLNK1120未解決の外部6 PortScannerWin32 c:¥users¥james¥documents¥visual studio 2017¥Projects¥PortScannerWin32¥Debug¥PortScannerWin32。exe 1

これは私のエラーです。私が正直であれば、文字通り全く手がかりがありません。私はチュートリアルの単語を単語に従って、依存関係などを入力しました。

何が問題になっているのでしょうか?私は明らかな答えはVS2017で使用されている2015ですが、SFML 2015にこれを許可するアップデートがあったため、多くのフォーラムが問題なく動作していると言いました。

+0

ライブラリーをリンクしていないようです。 – Sneftel

+0

リンカー - >一般私はD:\ SFML-2.4.2 \ libで追加のライブラリディレクトリを記入しましたが、それはリンクされていませんか?私は依存関係をタイプしました。他に何かしなければならないことがありますか? – toiletduck123

+0

[定義されていない参照/未解決の外部シンボルエラーとは何ですか?どうすれば解決できますか?](https://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-シンボル・エラー・アンド・ハウ・ド・イ・フィックス) – Sneftel

答えて

2

私はこのライブラリに関する知識はありませんが、これはかなり標準的なリンカエラーのようです。 VS 2017(Platform Toolset v141)とVS 2015(Plaform Toolset v141)でコンパイルされたライブラリとのリンクは問題ありません。マイクロソフトはVS 2015と2017のコンパイラ間でバイナリ互換性を維持しているため、コンパイルされたコードを同じ実行可能ファイルにまとめて混在させることができます。

あなたが使用しているクラスの実装を「約束」している(SFML/Network.hpp)ヘッダファイル。これは、静的なlib(.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 

は、私は、x64へのVisual Studio内のプロジェクトのプラットフォーム値を変更しますので、ライブラリーの「bit化は、」あなたのexecutibleのそれと一致しました。これはネイティブマシンコードなので、生成されたコードは同じアーキテクチャーでなければなりません。

これを変更する場合は、コードがコンパイルされるように、インクルードパスやライブラリパス、リンカ入力などのプロジェクトプロパティを設定する必要があることに注意してください。プロジェクトプロパティシートを使用して、x64値をx86プラットフォームの値に設定できます。

3

正しいライブラリプラットフォームとリンクしていません。

警告LNK4272ライブラリのマシン・タイプターゲット・マシン・タイプ 'X86' PortScannerWin32 Dとの「x64の葛藤:\ SFML-2.4.2 \ libに\ SFML-ネットワーク-d.lib 1

この状態プロジェクトが32ビットである間に64ビットライブラリとリンクしていることを確認します。正しいライブラリを使用するか、プロジェクトを更新して64ビットプロジェクトとしてビルドしてください。