22982


現在、OpenSSL(1.0.2g)とBoost（1.60）を、TLS1.2でHTTPS通信をするプログラムを作成しています。  
開発環境は、Windows10上で動作するVisualStudio2015です。  
ビルドは32bit（x86）のリリースモードで行います。  
ライブラリとのリンクはすべて静的リンクです。（組み込み先に制約があるため）

ランタイムライブラリは、「マルチスレッド (/MT)」にしています。

以下のようなプログラムです。  
（__iob_funcが未定義と言われるためとりあえず__iob_funcを実装してありますが、これは正攻法なのでしょうか）

[code]

    #include<iostream>
    #include<boost/asio.hpp>
    #include<boost/asio/ssl.hpp>
    
    namespace asio = boost::asio;
    namespace ip = asio::ip;
    using namespace std;
    // __iob_func未定義エラー回避のため。
    FILE _iob[] = { *stdin, *stdout, *stderr };
    extern "C" FILE * __cdecl __iob_func(void)
    {
        return _iob;
    }
    
    int main() {
        try {
            asio::io_service io_service;
            ip::tcp::socket sock(io_service);
            // 正しくビルドできるか確認するだけのコードです。
            boost::asio::ssl::context context(io_service, boost::asio::ssl::context::tlsv12_client);
            boost::asio::ssl::stream< boost::asio::ip::tcp::socket > ssl_stream(io_service, context);
    
            ip::tcp::resolver resolver(io_service);
            ip::tcp::resolver::query query("sourceforge.net", "https");
            ip::tcp::endpoint endpoint(*resolver.resolve(query));
            sock.connect(endpoint);
    
            asio::streambuf request;
            ostream request_ostream(&request);
            request_ostream << "GET /\r\nHost:sourceforge.net\r\n\r\n";
            asio::write(sock, request);
    
            asio::streambuf buffer;
            boost::system::error_code error;
            asio::read(sock, buffer, asio::transfer_all(), error);
            if (error && error != asio::error::eof)
            {
                std::cout << "receive failed: " << error.message() << std::endl;
            }
            else
            {
                cout << &buffer << endl;
            }
        }catch (exception& e){
            cout << e.what();
        }
        return 0;
    }
    
[/code]

これをVisualStudio2015でビルドすると、リンクエラーが発生します。

[code]

    1>libeay32.lib(cryptlib.obj) : error LNK2001: 外部シンボル "__vsnprintf" は未解決です。
    1>libeay32.lib(pqueue.obj) : error LNK2001: 外部シンボル "_printf" は未解決です。
    1>libeay32.lib(v3_utl.obj) : error LNK2001: 外部シンボル "_sscanf" は未解決です。
    1>libeay32.lib(dso_win32.obj) : error LNK2001: 外部シンボル "_sprintf" は未解決です。
    
[/code]

VS2015のビルドオプションか、OpenSSL側のビルド方法で解決できればいいのですが、  
解決方法を教えていただければと。

補足情報ですが、BoostとOpenSSLは下記の方法でビルドしています。

・boost 32bit版

[code]

    b2 toolset=msvc threading=multi variant=debug,release link=static runtime-link=static address-model=32 --stagedir=stage/x86 -j 8
    
[/code]

・boost 64bit版

[code]

    b2 toolset=msvc threading=multi variant=debug,release link=static runtime-link=static address-model=64 --stagedir=stage/x64 -j 8
    
[/code]

・OpenSSL 32bit版

[code]

    cd c:\openssl\openssl-1.0.2g
    perl Configure no-asm --prefix=..\x86 VC-WIN32
    ms\do_ms.bat
    nmake -f ms\nt.mak install
    
[/code]

・OpenSSL 64bit版

[code]

    cd c:\openssl\openssl-1.0.2g
    perl Configure no-asm --prefix=..\x64 VC-WIN64A
    ms\do_win64a.bat
    nmake -f ms\nt.mak install
    
[/code]

回答よろしくお願いします。


CC BY-SA 3.0
2016-03-10T08:11:53.413
22980
2016-03-10T09:50:23.137
2016-03-10T08:22:25.390
13886
13886
question
c++ windows openssl boost
VisualStudio 2015でのOpenSSL（libeay32.lib）リンクエラー


外しているかもしれませんが、OpenSSLのビルドオプションがスタティックリンクになっていないのではないでしょうか。  
また、OpenSSLをビルドした環境と、現在開発をされている環境でコンパイラのバージョンが違うということはないでしょうか？  
上記のような条件でバージョンが違うライブラリを参照した場合、未解決エラーが出ることがあります。

一度OpenSSLを現在の開発環境でビルドしなおしてみてはいかがでしょう。


CC BY-SA 3.0
2016-03-10T09:50:23.137
22982
2016-03-10T09:50:23.137
9515
22980
answer