1

VS2010でBoostAsioの次のコード例を実行しようとしています-64ビット。リンクから取得

#include <boost/asio.hpp> 
#include <boost/array.hpp> 
#include <iostream> 
#include <string> 

boost::asio::io_service io_service; 
boost::asio::ip::tcp::resolver resolver(io_service); 
boost::asio::ip::tcp::socket sock(io_service); 
boost::array<char, 4096> buffer; 

void read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred) 
{ 
    if (!ec) 
    { 
        std::cout << std::string(buffer.data(), bytes_transferred) << std::endl; 
        sock.async_read_some(boost::asio::buffer(buffer), read_handler); 
    } 
} 

void connect_handler(const boost::system::error_code &ec) 
{ 
    if (!ec) 
    { 
        boost::asio::write(sock, boost::asio::buffer("GET / HTTP 1.1\r\nHost: highscore.de\r\n\r\n")); 
        sock.async_read_some(boost::asio::buffer(buffer), read_handler); 
    } 
} 

void resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it) 
{ 
    if (!ec) 
    { 
        sock.async_connect(*it, connect_handler); 
    } 
} 

int main() 
{ 
    boost::asio::ip::tcp::resolver::query query("www.highscore.de", "80"); 
    resolver.async_resolve(query, resolve_handler); 
    io_service.run(); 
} 

その後、次のエラーが発生し始めました

cannot open file 'libboost_system-vc100-mt-sgd-1_47.lib'
cannot open file 'libboost_date_time-vc100-mt-sgd-1_47.lib'
cannot open file 'libboost_regex-vc100-mt-sgd-1_47.lib'

これらの問題を解決するために、私はこれらのファイルをリンクからダウンロードしました

そのため、次のエラーが発生し始めました。

Error   12  error LNK1169: one or more multiply defined symbols found   
Error   8   error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)   
Error   10  error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj)    
Error   9   error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) 
Error   11  error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj) 

何がうまくいかないかについての提案。追加の依存関係にいくつかの入力を設定する必要がありますか?

4

1 に答える 1

0

おそらく、Visual Studio を再インストールする必要はありません。表示されているエラーは、バージョン管理の問題の一種に関係していると思います。発生しているエラーは、一部のコンポーネントが 1 つのライブラリ セットでビルドされ、他のコンポーネントが別のライブラリ セットでビルドされたことを示しています。エラーで:

error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)   

ファイル名 LIBCMTD (MTD) の最後の 3 文字は、マルチスレッド ライブラリを表します。MT (マルチスレッド - デバッグなし) や MDd (DLL のマルチスレッド デバッグ) など、異なるタイプのライブラリでこのコードを使用する他のコンポーネントをビルドしている場合、このエラーが発生します。Boost 用の間違ったライブラリ セットにリンクしている場合にも、このエラーが発生する可能性があります。実際、上記のエラーから、使用しようとしているライブラリは次のとおりです。

「libboost_system-vc100-mt-sgd-1_47.lib」

これはリリース版だと思います。独自のコードで使用しているのと同じ種類のライブラリでビルドする必要があります。MTD を使用している場合は、Boost ライブラリの MTD バージョンでもビルドします。

プロジェクトが使用しているライブラリを確認するには、ソリューション エクスプローラー ウィンドウでプロジェクトを右クリックし、プロパティを選択します。プロパティはプロジェクト メニューから選択することもできますが、これを行う前に、編集ウィンドウで開いている現在のファイルとしてそのプロジェクトにファイルがあることを確認してください。ランタイム ライブラリの下に、使用しているライブラリのタイプが表示されます。プロジェクト タイプが dll の場合、この値は実際には MDd に設定する必要があります。プロジェクトのタイプを確認するには、プロパティの下のリンカー (またはライブラリアン) オプションをクリックし、出力ファイルが dll の場合、プロジェクトのタイプは dll です。ライブラリまたは exe と表示されている場合、プロジェクトはそれぞれライブラリまたは exe です。特定のタイプのプロジェクトはすべて同じ方法でビルドする必要があります。たとえば、リリース バージョンとデバッグ バージョンを混在させようとしないでください。ビルド中の exe がある場合は、ライブラリ タイプのプロジェクトのビルドに使用されたライブラリを使用します。ライブラリを設定するには、プロパティで [構成プロパティ] / [C/C++] / [コード生成] / [ランタイム ライブラリ] を選択し、ドロップダウン ボックスからタイプを選択します。

すべてのプロジェクトで構成が正しいと思われる場合は、最初から再構築してみてください。これを行うには、プロジェクトを右クリックして [クリーン] を選択し、続いて [再構築] を選択します。

于 2013-03-21T17:03:43.280 に答える