# Build and static link ZeroMQ on Windows

ZeroMQ ( http://zeromq.org and https://github.com/zeromq/libzmq ) is a library that allows code to communicate between threads, processes, or computers in just a few lines and uses simple, composable patterns (like publish-subscribe and broadcast).

In this post, we’ll build ZeroMQ on Windows as a static library (to take advantage of the “static linking exception” in its license: http://zeromq.org/area:licensing ) and then bake that static library into a simple Windows executable.  There are many posts around the web that show you how to do this … here’s one more:

### Step 1: Build Vcpkg ( https://github.com/Microsoft/vcpkg )

Notes:

• Vcpkg does not manage pre-built binaries (like NuGet or Homebrew)
• Vcpkg manages source code and builds that source code on Windows, Linux, and MacOS.
• At the time of this post, the documentation for Vcpkg was located here:
https://docs.microsoft.com/en-us/cpp/vcpkg

In a Visual Studio 2017 developer command prompt (with Git installed), execute the following commands:

cd /d C:\
mkdir Repos
cd /d C:\Repos\
git clone https://github.com/Microsoft/vcpkg
cd /d C:\Repos\vcpkg\
bootstrap-vcpkg.bat


… now, C:\Repos\vcpkg\vcpkg.exe should exist.

### Step 2: Use vcpkg to build ZeroMQ ( vcpkg install zeromq:x64-windows-static )

Note:

• On purpose … to make things more explicit and more difficult in Step 3, we do not execute the following command:
vcpkg integrate install

Now that C:\Repos\vcpkg\vcpkg.exe exists, execute the following commands:

cd /d C:\Repos\vcpkg\
vcpkg install zeromq:x64-windows-static

… now, we should have the following:

• ZeroMQ source code folder: C:\Repos\vcpkg\buildtrees\zeromq\src
• ZeroMQ debug build folder: C:\Repos\vcpkg\buildtrees\zeromq\x64-windows-static-dbg
• ZeroMQ release build folder: C:\Repos\vcpkg\buildtrees\zeromq\x64-windows-static-rel
• ZeroMQ target folder: C:\Repos\vcpkg\packages\zeromq_x64-windows-static
• ZeroMQ target include folder: C:\Repos\vcpkg\packages\zeromq_x64-windows-static\include
• ZeroMQ target debug lib folder: C:\Repos\vcpkg\packages\zeromq_x64-windows-static\debug\lib
• At the time of this post, the static library built was: libzmq-mt-sgd-4_3_1.lib
• Note: The mt and d in libzmq-mt-sgd-4_3_1.lib means multi-threaded debug (requiring the debug executable in the next step to be compiled using /MTd)
• ZeroMQ target release lib folder: C:\Repos\vcpkg\packages\zeromq_x64-windows-static\lib
• At the time of this post, the static library built was: libzmq-mt-s-4_3_1.lib
• Note: The mt in libzmq-mt-s-4_3_1.lib means multi-threaded (requiring the release executable in the next step to be compiled using /MT)

### Step 3: Build an executable that statically links ZeroMQ

In Visual Studio 2017, do the following:

• File / New / Project…

• Paste the following code into Source.cpp:
#include <zmq.h>
#include <iostream>

int main()
{
int major = 0;
int minor = 0;
int patch = 0;
zmq_version( &major, &minor, &patch );
std::wcout << "Current 0MQ version is " << major << '.' << minor << '.' << patch << '\n';
}
• Change the Solution Platform to x64:

• Select the “ZeroMQ-Version” project, select Project / Properties, change the Configuration to “All Configurations“, select Configuration Properties / C/C++ / General, and then add the following include folder to “Additional Include Directories“:
C:\Repos\vcpkg\packages\zeromq_x64-windows-static\include

• Next, for “All Configurations“, select Configuration Properties / C/C++ / Preprocessor, and then add the following preprocessor definition to “Preprocessor Definitions“:
ZMQ_STATIC

• Next, change the Configuration to “Debug“, select Configuration Properties / C/C++ / Code Generation, and then change the “Runtime Library” to “Multi-threaded Debug (/MTd)“:

• Next, change the Configuration to “Release“, select Configuration Properties / C/C++ / Code Generation, and then change the “Runtime Library” to “Multi-threaded (/MT)“:

• Next, we’ll add the static libraries … and while we could break these up into separate lib folder and lib file entries, I’ll just use each lib’s full file path here.
• First, switch the Configuration back to “Debug“, select Configuration Properties / Linker / Input, and then add the following entries to “Additional Dependencies“:
C:\Repos\vcpkg\packages\zeromq_x64-windows-static\debug\lib\libzmq-mt-sgd-4_3_1.lib
Ws2_32.lib
Iphlpapi.lib

• Second, switch the Configuration back to “Release“, select Configuration Properties / Linker / Input, and then add the following entries to “Additional Dependencies“:
C:\Repos\vcpkg\packages\zeromq_x64-windows-static\lib\libzmq-mt-s-4_3_1.lib
Ws2_32.lib
Iphlpapi.lib

• Build / Rebuild Solution:

Note:

• When building for Debug, my Output window reads:
1>------ Rebuild All started: Project: ZeroMQ-Version, Configuration: Debug x64 ------
1>Source.cpp
1>ZeroMQ-Version.vcxproj -> C:\Repos\ZeroMQ-Version\x64\Debug\ZeroMQ-Version.exe
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
• When building for Release, my Output window reads:
1>------ Rebuild All started: Project: ZeroMQ-Version, Configuration: Release x64 ------
1>Source.cpp
1>Generating code
1>All 3752 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
1>Finished generating code
1>ZeroMQ-Version.vcxproj -> C:\Repos\ZeroMQ-Version\x64\Release\ZeroMQ-Version.exe
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

Hope This Helps!

Tagged on: , ,

This site uses Akismet to reduce spam. Learn how your comment data is processed.