94634


Zeromqという外部ライブラリを用いて、PythonとC++の自作のプログラム間で、メッセージを通信してたいと考えています。  
そのため、これをインクルードして使いたいと考えています。

Pythonでのpipでのビルドは出来たのですが、C++側のビルドが分からず、質問させていただきました。

このライブラリは、c++用のものはなく [Libzmq](https://github.com/zeromq/libzmq) というC言語用のライブラリに、
[cppzmq](https://github.com/zeromq/cppzmq) と呼ばれるC++のためのラッパー関数を用いて実装するようです。

今回、プログラムファイル直下に、Zeromqというフォルダを作成し、そこに2つのプログラムファイルをダウンロードし解凍したものを配置しました。  
さらに、libzmqはcmakeで、コマンドからslnファイルを作成し、そこからビルドを行い、libファイルを作成いたしました。  
その後、自作のc++のファイルでビルドを行うために、インクルードディレクトリにLibzmqのincludeファイルのディレクトリを、リンカに出力したlibのファイル名、ディレクトリを追加しました。

さらに、cppzmqのうち、zmq.hpp
zmq_addon.hppをslnファイルのあるディレクトリのincludeフォルダに配置して、ソースファイルに加えました。

ここで以下のコードを実行すると、LNK2019のエラーが出て、未解決の外部シンボル_imp_zmq_•••が〜で参照されました。というエラーが9件ほど出ます。

どのように対処すれば良いのか、教えていただきたいです。

[code]

    #include <string>
    #include "include/zmq.hpp"
    int main()
    {
       zmq::context_t ctx;
       zmq::socket_t sock(ctx, zmq::socket_type::push);
       sock.bind("inproc://test");
       const std::string_view m = "Hello, world";
       sock.send(zmq::buffer(m), zmq::send_flags::dontwait);
    }
    
[/code]


CC BY-SA 4.0
2023-04-24T08:04:16.593
94631
2023-05-04T05:50:55.670
2023-05-04T05:46:33.440
4236
58047
question
c++ windows visual-c++
ZeromqをC++でビルドする方法


> libzmqはcmakeで、コマンドからslnファイルを作成し、そこからビルドを行い、libファイルを作成いたしました。

CMakeとVisual Studioは相互に対応機能を持っています。つまり、[CMakeはVisual Studio
Generatorsを持っていて](https://cmake.org/cmake/help/latest/manual/cmake-
generators.7.html#id14)CMakeLists.txtから.slnを生成できますし、[Visual
StudioはCMakeLists.txtをそのままプロジェクトファイルとして扱えます](https://learn.microsoft.com/ja-
jp/cpp/build/cmake-projects-in-visual-
studio?view=msvc-170)。かなりややこしいことになっていますし、各ライブラリの作者がどちらを想定して実装しているかもぱっと見ではわかりづらいです。  
実際、ビルドできたライブラリの扱い方が分からなくなっての質問ですし。

このような場合、[vcpkgというパッケージマネージャ](https://github.com/microsoft/vcpkg)を利用されることをお勧めします。質問された[Zeromqでも（CMakeでの方法は提示せず）vcpkgでのビルド方法を紹介](https://github.com/zeromq/libzmq#installation-
of-package-manager-)しています。

Zeromqの説明と手順は被りますがvcpkg側にも[Quick Start:
Windows](https://github.com/microsoft/vcpkg#quick-start-windows)に手順が記されています。

[code]

    > git clone https://github.com/microsoft/vcpkg
    > .\vcpkg\bootstrap-vcpkg.bat
    > .\vcpkg\vcpkg integrate install
    
[/code]

これでvcpkgでインストールしたライブラリをVisual C++から参照する準備が整います。  
cppzmqは

[code]

    > .\vcpkg\vcpkg install cppzmq
    > .\vcpkg\vcpkg install cppzmq:x64-windows （x64ビルドはこちら）
    
[/code]

でダウンロード、ビルド及びインストールが完了します。依存関係が設定されているため、このコマンドでzeromqも同時にインストールされます。

先に述べたようにvcpkgでインストールしたライブラリはVisual
C++から参照できますから、ヘッダファイルは普通に`#include`できますし、リンクすべきライブラリも設定済みです。つまり質問のコードは

[code]

    #include <string>
    #include <zmq.hpp>
    
    int main() {
        zmq::context_t ctx;
        zmq::socket_t sock(ctx, zmq::socket_type::push);
        sock.bind("inproc://test");
        const std::string_view m = "Hello, world";
        sock.send(zmq::buffer(m), zmq::send_flags::dontwait);
    }
    
[/code]

とするだけでコンパイル・リンクに成功します。  
ただし、[`string_view`が導入されたのはC++17から](https://cpprefjp.github.io/reference/string_view.html)なのに対し[Visual
C++は既定でC++14をターゲット](https://learn.microsoft.com/ja-jp/cpp/build/reference/std-
specify-language-standard-version?view=msvc-170#c-standards-
support)としており、`string_view`は使えません。コンパイルオプション`/std:c++17`を指定する必要があります。

* * *

現在ベータ版の[Visual Studio 2022 (version
17.6)からはvcpkgが組み込まれている](https://devblogs.microsoft.com/cppblog/vcpkg-2023-04-15-release-
vcpkg-ships-in-visual-studio-xbox-triplets-github-actions-cache-support-and-
more/#vcpkg-now-included-with-visual-studio-ide)そうですので、冒頭にあげた手順も今後は不要になりそうです。


CC BY-SA 4.0
2023-04-24T09:09:53.107
94634
2023-05-04T05:50:55.670
2023-05-04T05:50:55.670
4236
4236
94631
answer