1*6777b538SAndroid Build Coastguard WorkerThis directory contains *CMake* files that can be used to build protobuf 2*6777b538SAndroid Build Coastguard Workerwith *MSVC* on *Windows*. You can build the project from *Command Prompt* 3*6777b538SAndroid Build Coastguard Workerand using an *Visual Studio* IDE. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard WorkerYou need to have [CMake](http://www.cmake.org), [Visual Studio](https://www.visualstudio.com) 6*6777b538SAndroid Build Coastguard Workerand optionally [Git](http://git-scm.com) installed on your computer before proceeding. 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard WorkerMost of the instructions will be given to the *Сommand Prompt*, but the same 9*6777b538SAndroid Build Coastguard Workeractions can be performed using appropriate GUI tools. 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard WorkerEnvironment Setup 12*6777b538SAndroid Build Coastguard Worker================= 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard WorkerOpen the appropriate *Command Prompt* from the *Start* menu. 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard WorkerFor example *x86 Native Tools Command Prompt for VS 2019*: 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional> 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard WorkerChange to your working directory: 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional>cd C:\Path\to 23*6777b538SAndroid Build Coastguard Worker C:\Path\to> 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard WorkerWhere *C:\Path\to* is path to your real working directory. 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard WorkerCreate a folder where protobuf headers/libraries/binaries will be installed after built: 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker C:\Path\to>mkdir install 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard WorkerIf *cmake* command is not available from *Command Prompt*, add it to system *PATH* variable: 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker C:\Path\to>set PATH=%PATH%;C:\Program Files (x86)\CMake\bin 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard WorkerIf *git* command is not available from *Command Prompt*, add it to system *PATH* variable: 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker C:\Path\to>set PATH=%PATH%;C:\Program Files\Git\cmd 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard WorkerOptionally, you will want to download [ninja](https://ninja-build.org/) and add it to your *PATH* variable. 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker C:\Path\to>set PATH=%PATH%;C:\tools\ninja 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard WorkerGood. Now you are ready to continue. 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard WorkerGetting Sources 46*6777b538SAndroid Build Coastguard Worker=============== 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard WorkerYou can get the latest stable source packages from the release page: 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker https://github.com/protocolbuffers/protobuf/releases/latest 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard WorkerFor example: if you only need C++, download `protobuf-cpp-[VERSION].tar.gz`; if 53*6777b538SAndroid Build Coastguard Workeryou need C++ and Java, download `protobuf-java-[VERSION].tar.gz` (every package 54*6777b538SAndroid Build Coastguard Workercontains C++ source already); if you need C++ and multiple other languages, 55*6777b538SAndroid Build Coastguard Workerdownload `protobuf-all-[VERSION].tar.gz`. 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard WorkerOr you can use git to clone from protobuf git repository. 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker C:\Path\to> mkdir src & cd src 60*6777b538SAndroid Build Coastguard Worker C:\Path\to\src> git clone -b [release_tag] https://github.com/protocolbuffers/protobuf.git 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard WorkerWhere *[release_tag]* is a git tag like *v3.0.0-beta-1* or a branch name like *main* 63*6777b538SAndroid Build Coastguard Workerif you want to get the latest code. 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard WorkerGo to the project folder: 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker C:\Path\to\src> cd protobuf 68*6777b538SAndroid Build Coastguard Worker C:\Path\to\src\protobuf> 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard WorkerRemember to update any submodules if you are using git clone (you can skip this 71*6777b538SAndroid Build Coastguard Workerstep if you are using a release .tar.gz or .zip package): 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker```console 74*6777b538SAndroid Build Coastguard WorkerC:\Path\to\src\protobuf> git submodule update --init --recursive 75*6777b538SAndroid Build Coastguard Worker``` 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard WorkerGood. Now you are ready for *CMake* configuration. 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard WorkerCMake Configuration 80*6777b538SAndroid Build Coastguard Worker=================== 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker*CMake* supports a lot of different 83*6777b538SAndroid Build Coastguard Worker[generators](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7.html) 84*6777b538SAndroid Build Coastguard Workerfor various native build systems. 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard WorkerOf most interest to Windows programmers are the following: 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker* [Makefile](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7.html#makefile-generators). 89*6777b538SAndroid Build Coastguard Worker This generates NMake Makefiles for Visual Studio. These work, but they are rather slow. 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Worker* [Visual Studio](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7.html#visual-studio-generators) 92*6777b538SAndroid Build Coastguard Worker This generates a Visual Studio solution for the project. 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker* [Ninja](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#ninja-generator) 95*6777b538SAndroid Build Coastguard Worker This uses the external tool [Ninja](https://ninja-build.org/) to build. It is the fastest solution available. 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard WorkerNote that as of Visual Studio 2015, Visual Studio includes 98*6777b538SAndroid Build Coastguard Worker[support for opening directly CMake-based projects](https://docs.microsoft.com/en-us/cpp/build/cmake-projects-in-visual-studio). 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard WorkerIt is considered good practice not to build CMake projects in the source tree but in a separate folder. 101*6777b538SAndroid Build Coastguard Worker 102*6777b538SAndroid Build Coastguard WorkerCreate a temporary *build* folder and change your working directory to it: 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker mkdir C:\Path\to\build\protobuf 105*6777b538SAndroid Build Coastguard Worker cd C:\Path\to\build\protobuf 106*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf> 107*6777b538SAndroid Build Coastguard Worker 108*6777b538SAndroid Build Coastguard WorkerThe *Makefile* and *Ninja* generators can build the project in only one configuration, so you need to build 109*6777b538SAndroid Build Coastguard Workera separate folder for each configuration. 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard WorkerTo start using a *Release* configuration via the *NMmake* generator: 112*6777b538SAndroid Build Coastguard Worker 113*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf>mkdir release & cd release 114*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf\release>cmake -G "NMake Makefiles" ^ 115*6777b538SAndroid Build Coastguard Worker -DCMAKE_BUILD_TYPE=Release ^ 116*6777b538SAndroid Build Coastguard Worker -DCMAKE_INSTALL_PREFIX=C:\Path\to\install ^ 117*6777b538SAndroid Build Coastguard Worker C:\Path\to\src\protobuf 118*6777b538SAndroid Build Coastguard Worker 119*6777b538SAndroid Build Coastguard WorkerIt will generate a *NMake* *Makefile* in the current directory. 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard WorkerTo use *Debug* configuration using *Ninja*: 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf>mkdir debug & cd debug 124*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf\debug>cmake -G "Ninja" ^ 125*6777b538SAndroid Build Coastguard Worker -DCMAKE_BUILD_TYPE=Debug ^ 126*6777b538SAndroid Build Coastguard Worker -DCMAKE_INSTALL_PREFIX=C:\Path\to\install ^ 127*6777b538SAndroid Build Coastguard Worker C:\Path\to\src\protobuf 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard WorkerIt will generate *Ninja* build scripts in current directory. 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard WorkerThe *Visual Studio* generator is multi-configuration: it will generate a single *.sln* file that can be used for both *Debug* and *Release*: 132*6777b538SAndroid Build Coastguard Worker 133*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf>mkdir solution & cd solution 134*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf\solution>cmake -G "Visual Studio 16 2019" ^ 135*6777b538SAndroid Build Coastguard Worker -DCMAKE_INSTALL_PREFIX=C:\Path\to\install ^ 136*6777b538SAndroid Build Coastguard Worker C:\Path\to\src\protobuf 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard WorkerIt will generate *Visual Studio* solution file *protobuf.sln* in current directory. 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard WorkerUnit Tests 141*6777b538SAndroid Build Coastguard Worker---------- 142*6777b538SAndroid Build Coastguard Worker 143*6777b538SAndroid Build Coastguard WorkerUnit tests are being built along with the rest of protobuf. The unit tests require Google Mock (now a part of Google Test). 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard WorkerA copy of [Google Test](https://github.com/google/googletest) is included as a Git submodule in the `third-party/googletest` folder. 146*6777b538SAndroid Build Coastguard Worker(You do need to initialize the Git submodules as explained above.) 147*6777b538SAndroid Build Coastguard Worker 148*6777b538SAndroid Build Coastguard WorkerAlternately, you may want to use protobuf in a larger set-up, you may want to use that standard CMake approach where 149*6777b538SAndroid Build Coastguard Workeryou build and install a shared copy of Google Test. 150*6777b538SAndroid Build Coastguard Worker 151*6777b538SAndroid Build Coastguard WorkerAfter you've built and installed your Google Test copy, you need add the following definition to your *cmake* command line 152*6777b538SAndroid Build Coastguard Workerduring the configuration step: `-Dprotobuf_USE_EXTERNAL_GTEST=ON`. 153*6777b538SAndroid Build Coastguard WorkerThis will cause the standard CMake `find_package(GTest REQUIRED)` to be used. 154*6777b538SAndroid Build Coastguard Worker 155*6777b538SAndroid Build Coastguard Worker[find_package](https://cmake.org/cmake/help/latest/command/find_package.html) will search in a default location, 156*6777b538SAndroid Build Coastguard Workerwhich on Windows is *C:\Program Files*. This is most likely not what you want. You will want instead to search for 157*6777b538SAndroid Build Coastguard WorkerGoogle Test in your project's root directory (i.e. the same directory you've passed to `CMAKE_INSTALL_PREFIX` when 158*6777b538SAndroid Build Coastguard Workerbuilding Google Test). For this, you need to set the `CMAKE_PREFIX_PATH` CMake variable. (There are other ways in CMake, 159*6777b538SAndroid Build Coastguard Workersee the [manual](https://cmake.org/cmake/help/latest/command/find_package.html) for details.) 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard WorkerFor example: 162*6777b538SAndroid Build Coastguard Worker 163*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf>mkdir solution & cd solution 164*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf\solution>cmake -G "Visual Studio 16 2019" ^ 165*6777b538SAndroid Build Coastguard Worker -DCMAKE_INSTALL_PREFIX=C:\Path\to\install ^ 166*6777b538SAndroid Build Coastguard Worker -DCMAKE_PREFIX_PATH=C:\Path\to\my_big_project ^ 167*6777b538SAndroid Build Coastguard Worker -Dprotobuf_USE_EXTERNAL_GTEST=ON ^ 168*6777b538SAndroid Build Coastguard Worker C:\Path\to\src\protobuf 169*6777b538SAndroid Build Coastguard Worker 170*6777b538SAndroid Build Coastguard WorkerIn most cases, `CMAKE_PREFIX_PATH` and `CMAKE_INSTALL_PREFIX` will point to the same directory. 171*6777b538SAndroid Build Coastguard Worker 172*6777b538SAndroid Build Coastguard WorkerTo disable testing completely, you need to add the following argument to you *cmake* command line: `-Dprotobuf_BUILD_TESTS=OFF`. 173*6777b538SAndroid Build Coastguard Worker 174*6777b538SAndroid Build Coastguard WorkerFor example: 175*6777b538SAndroid Build Coastguard Worker 176*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf\solution>cmake -G "Visual Studio 16 2019" ^ 177*6777b538SAndroid Build Coastguard Worker -DCMAKE_INSTALL_PREFIX=C:\Path\to\install ^ 178*6777b538SAndroid Build Coastguard Worker -Dprotobuf_BUILD_TESTS=OFF ^ 179*6777b538SAndroid Build Coastguard Worker C:\Path\to\src\protobuf 180*6777b538SAndroid Build Coastguard Worker 181*6777b538SAndroid Build Coastguard WorkerCompiling 182*6777b538SAndroid Build Coastguard Worker========= 183*6777b538SAndroid Build Coastguard Worker 184*6777b538SAndroid Build Coastguard WorkerThe standard way to compile a *CMake* project is `cmake --build <directory>`. 185*6777b538SAndroid Build Coastguard Worker 186*6777b538SAndroid Build Coastguard Worker 187*6777b538SAndroid Build Coastguard WorkerNote that if your generator supports multiple configurations, you will probably want to specify which one to build: 188*6777b538SAndroid Build Coastguard Worker 189*6777b538SAndroid Build Coastguard Worker cmake --build C:\Path\to\build\protobuf\solution --config Release 190*6777b538SAndroid Build Coastguard Worker 191*6777b538SAndroid Build Coastguard WorkerYou can also run directly the build tool you've configured: 192*6777b538SAndroid Build Coastguard Worker 193*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf\release>nmake 194*6777b538SAndroid Build Coastguard Worker 195*6777b538SAndroid Build Coastguard Workeror 196*6777b538SAndroid Build Coastguard Worker 197*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf\debug>ninja 198*6777b538SAndroid Build Coastguard Worker 199*6777b538SAndroid Build Coastguard WorkerAnd wait for the compilation to finish. 200*6777b538SAndroid Build Coastguard Worker 201*6777b538SAndroid Build Coastguard WorkerIf you prefer to use the IDE: 202*6777b538SAndroid Build Coastguard Worker 203*6777b538SAndroid Build Coastguard Worker * Open the generated protobuf.sln file in Microsoft Visual Studio. 204*6777b538SAndroid Build Coastguard Worker * Choose "Debug" or "Release" configuration as desired. 205*6777b538SAndroid Build Coastguard Worker * From the Build menu, choose "Build Solution". 206*6777b538SAndroid Build Coastguard Worker 207*6777b538SAndroid Build Coastguard WorkerAnd wait for the compilation to finish. 208*6777b538SAndroid Build Coastguard Worker 209*6777b538SAndroid Build Coastguard WorkerTesting 210*6777b538SAndroid Build Coastguard Worker======= 211*6777b538SAndroid Build Coastguard Worker 212*6777b538SAndroid Build Coastguard WorkerTo run unit-tests, first you must compile protobuf as described above. 213*6777b538SAndroid Build Coastguard WorkerThen run: 214*6777b538SAndroid Build Coastguard Worker 215*6777b538SAndroid Build Coastguard Worker C:\Path\to\protobuf\cmake\build\release>ctest --progress --output-on-failure 216*6777b538SAndroid Build Coastguard Worker 217*6777b538SAndroid Build Coastguard WorkerYou can also build the `check` target (not idiomatic CMake usage, though): 218*6777b538SAndroid Build Coastguard Worker 219*6777b538SAndroid Build Coastguard Worker C:\Path\to\protobuf\cmake\build\release>cmake --build . --target check 220*6777b538SAndroid Build Coastguard Worker 221*6777b538SAndroid Build Coastguard Workeror 222*6777b538SAndroid Build Coastguard Worker 223*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf\release>ninja check 224*6777b538SAndroid Build Coastguard Worker 225*6777b538SAndroid Build Coastguard WorkerYou can also build project *check* from Visual Studio solution. 226*6777b538SAndroid Build Coastguard WorkerYes, it may sound strange, but it works. 227*6777b538SAndroid Build Coastguard Worker 228*6777b538SAndroid Build Coastguard WorkerYou should see output similar to: 229*6777b538SAndroid Build Coastguard Worker 230*6777b538SAndroid Build Coastguard Worker Running main() from gmock_main.cc 231*6777b538SAndroid Build Coastguard Worker [==========] Running 1546 tests from 165 test cases. 232*6777b538SAndroid Build Coastguard Worker 233*6777b538SAndroid Build Coastguard Worker ... 234*6777b538SAndroid Build Coastguard Worker 235*6777b538SAndroid Build Coastguard Worker [==========] 1546 tests from 165 test cases ran. (2529 ms total) 236*6777b538SAndroid Build Coastguard Worker [ PASSED ] 1546 tests. 237*6777b538SAndroid Build Coastguard Worker 238*6777b538SAndroid Build Coastguard WorkerTo run specific tests, you need to pass some command line arguments to the test program itself: 239*6777b538SAndroid Build Coastguard Worker 240*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf\release>tests.exe --gtest_filter=AnyTest* 241*6777b538SAndroid Build Coastguard Worker Running main() from gmock_main.cc 242*6777b538SAndroid Build Coastguard Worker Note: Google Test filter = AnyTest* 243*6777b538SAndroid Build Coastguard Worker [==========] Running 3 tests from 1 test case. 244*6777b538SAndroid Build Coastguard Worker [----------] Global test environment set-up. 245*6777b538SAndroid Build Coastguard Worker [----------] 3 tests from AnyTest 246*6777b538SAndroid Build Coastguard Worker [ RUN ] AnyTest.TestPackAndUnpack 247*6777b538SAndroid Build Coastguard Worker [ OK ] AnyTest.TestPackAndUnpack (0 ms) 248*6777b538SAndroid Build Coastguard Worker [ RUN ] AnyTest.TestPackAndUnpackAny 249*6777b538SAndroid Build Coastguard Worker [ OK ] AnyTest.TestPackAndUnpackAny (0 ms) 250*6777b538SAndroid Build Coastguard Worker [ RUN ] AnyTest.TestIs 251*6777b538SAndroid Build Coastguard Worker [ OK ] AnyTest.TestIs (0 ms) 252*6777b538SAndroid Build Coastguard Worker [----------] 3 tests from AnyTest (1 ms total) 253*6777b538SAndroid Build Coastguard Worker 254*6777b538SAndroid Build Coastguard Worker [----------] Global test environment tear-down 255*6777b538SAndroid Build Coastguard Worker [==========] 3 tests from 1 test case ran. (2 ms total) 256*6777b538SAndroid Build Coastguard Worker [ PASSED ] 3 tests. 257*6777b538SAndroid Build Coastguard Worker 258*6777b538SAndroid Build Coastguard WorkerNote that the tests must be run from the source folder. 259*6777b538SAndroid Build Coastguard Worker 260*6777b538SAndroid Build Coastguard WorkerIf all tests are passed, safely continue. 261*6777b538SAndroid Build Coastguard Worker 262*6777b538SAndroid Build Coastguard WorkerInstalling 263*6777b538SAndroid Build Coastguard Worker========== 264*6777b538SAndroid Build Coastguard Worker 265*6777b538SAndroid Build Coastguard WorkerTo install protobuf to the *install* folder you've specified in the configuration step, you need to build the `install` target: 266*6777b538SAndroid Build Coastguard Worker 267*6777b538SAndroid Build Coastguard Worker cmake --build C:\Path\to\build\protobuf\solution --config Release --target install 268*6777b538SAndroid Build Coastguard Worker 269*6777b538SAndroid Build Coastguard WorkerOr if you prefer: 270*6777b538SAndroid Build Coastguard Worker 271*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf\release>nmake install 272*6777b538SAndroid Build Coastguard Worker 273*6777b538SAndroid Build Coastguard Workeror 274*6777b538SAndroid Build Coastguard Worker 275*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\protobuf\debug>ninja install 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard WorkerYou can also build project *INSTALL* from Visual Studio solution. 278*6777b538SAndroid Build Coastguard WorkerIt sounds not so strange and it works. 279*6777b538SAndroid Build Coastguard Worker 280*6777b538SAndroid Build Coastguard WorkerThis will create the following folders under the *install* location: 281*6777b538SAndroid Build Coastguard Worker * bin - that contains protobuf *protoc.exe* compiler; 282*6777b538SAndroid Build Coastguard Worker * include - that contains C++ headers and protobuf *.proto files; 283*6777b538SAndroid Build Coastguard Worker * lib - that contains linking libraries and *CMake* configuration files for *protobuf* package. 284*6777b538SAndroid Build Coastguard Worker 285*6777b538SAndroid Build Coastguard WorkerNow you can if needed: 286*6777b538SAndroid Build Coastguard Worker * Copy the contents of the include directory to wherever you want to put headers. 287*6777b538SAndroid Build Coastguard Worker * Copy protoc.exe wherever you put build tools (probably somewhere in your PATH). 288*6777b538SAndroid Build Coastguard Worker * Copy linking libraries libprotobuf[d].lib, libprotobuf-lite[d].lib, and libprotoc[d].lib wherever you put libraries. 289*6777b538SAndroid Build Coastguard Worker 290*6777b538SAndroid Build Coastguard WorkerTo avoid conflicts between the MSVC debug and release runtime libraries, when 291*6777b538SAndroid Build Coastguard Workercompiling a debug build of your application, you may need to link against a 292*6777b538SAndroid Build Coastguard Workerdebug build of libprotobufd.lib with "d" postfix. Similarly, release builds should link against 293*6777b538SAndroid Build Coastguard Workerrelease libprotobuf.lib library. 294*6777b538SAndroid Build Coastguard Worker 295*6777b538SAndroid Build Coastguard WorkerDLLs vs. static linking 296*6777b538SAndroid Build Coastguard Worker======================= 297*6777b538SAndroid Build Coastguard Worker 298*6777b538SAndroid Build Coastguard WorkerStatic linking is now the default for the Protocol Buffer libraries. Due to 299*6777b538SAndroid Build Coastguard Workerissues with Win32's use of a separate heap for each DLL, as well as binary 300*6777b538SAndroid Build Coastguard Workercompatibility issues between different versions of MSVC's STL library, it is 301*6777b538SAndroid Build Coastguard Workerrecommended that you use static linkage only. However, it is possible to 302*6777b538SAndroid Build Coastguard Workerbuild libprotobuf and libprotoc as DLLs if you really want. To do this, 303*6777b538SAndroid Build Coastguard Workerdo the following: 304*6777b538SAndroid Build Coastguard Worker 305*6777b538SAndroid Build Coastguard Worker * Add an additional flag `-Dprotobuf_BUILD_SHARED_LIBS=ON` when invoking cmake 306*6777b538SAndroid Build Coastguard Worker * Follow the same steps as described in the above section. 307*6777b538SAndroid Build Coastguard Worker * When compiling your project, make sure to `#define PROTOBUF_USE_DLLS`. 308*6777b538SAndroid Build Coastguard Worker 309*6777b538SAndroid Build Coastguard WorkerWhen distributing your software to end users, we strongly recommend that you 310*6777b538SAndroid Build Coastguard Workerdo NOT install libprotobuf.dll or libprotoc.dll to any shared location. 311*6777b538SAndroid Build Coastguard WorkerInstead, keep these libraries next to your binaries, in your application's 312*6777b538SAndroid Build Coastguard Workerown install directory. C++ makes it very difficult to maintain binary 313*6777b538SAndroid Build Coastguard Workercompatibility between releases, so it is likely that future versions of these 314*6777b538SAndroid Build Coastguard Workerlibraries will *not* be usable as drop-in replacements. 315*6777b538SAndroid Build Coastguard Worker 316*6777b538SAndroid Build Coastguard WorkerIf your project is itself a DLL intended for use by third-party software, we 317*6777b538SAndroid Build Coastguard Workerrecommend that you do NOT expose protocol buffer objects in your library's 318*6777b538SAndroid Build Coastguard Workerpublic interface, and that you statically link protocol buffers into your 319*6777b538SAndroid Build Coastguard Workerlibrary. 320*6777b538SAndroid Build Coastguard Worker 321*6777b538SAndroid Build Coastguard WorkerZLib support 322*6777b538SAndroid Build Coastguard Worker============ 323*6777b538SAndroid Build Coastguard Worker 324*6777b538SAndroid Build Coastguard WorkerIf you want to include GzipInputStream and GzipOutputStream 325*6777b538SAndroid Build Coastguard Worker(google/protobuf/io/gzip_stream.h) in libprotobuf, you will need to do a few 326*6777b538SAndroid Build Coastguard Workeradditional steps. 327*6777b538SAndroid Build Coastguard Worker 328*6777b538SAndroid Build Coastguard WorkerObtain a copy of the zlib library. The pre-compiled DLL at zlib.net works. 329*6777b538SAndroid Build Coastguard WorkerYou need prepare it: 330*6777b538SAndroid Build Coastguard Worker 331*6777b538SAndroid Build Coastguard Worker * Make sure zlib's two headers are in your `C:\Path\to\install\include` path 332*6777b538SAndroid Build Coastguard Worker * Make sure zlib's linking libraries (*.lib file) is in your 333*6777b538SAndroid Build Coastguard Worker `C:\Path\to\install\lib` library path. 334*6777b538SAndroid Build Coastguard Worker 335*6777b538SAndroid Build Coastguard WorkerYou can also compile it from source by yourself. 336*6777b538SAndroid Build Coastguard Worker 337*6777b538SAndroid Build Coastguard WorkerGetting sources: 338*6777b538SAndroid Build Coastguard Worker 339*6777b538SAndroid Build Coastguard Worker C:\Path\to\src>git clone -b v1.2.8 https://github.com/madler/zlib.git 340*6777b538SAndroid Build Coastguard Worker C:\Path\to\src>cd zlib 341*6777b538SAndroid Build Coastguard Worker 342*6777b538SAndroid Build Coastguard WorkerCompiling and Installing: 343*6777b538SAndroid Build Coastguard Worker 344*6777b538SAndroid Build Coastguard Worker C:\Path\to\src\zlib>mkdir C:\Path\to\build\zlib & cd C:\Path\to\build\zlib 345*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\zlib>mkdir release & cd release 346*6777b538SAndroid Build Coastguard Worker C:\Path\to\build\zlib\release>cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Release ^ 347*6777b538SAndroid Build Coastguard Worker -DCMAKE_INSTALL_PREFIX=C:\Path\to\install C:\Path\to\src\zlib 348*6777b538SAndroid Build Coastguard Worker C:\Path\to\src\zlib\build\release>cmake --build . --target install 349*6777b538SAndroid Build Coastguard Worker 350*6777b538SAndroid Build Coastguard WorkerYou can make *debug* version or use *Visual Studio* generator also as before for the 351*6777b538SAndroid Build Coastguard Workerprotobuf project. 352*6777b538SAndroid Build Coastguard Worker 353*6777b538SAndroid Build Coastguard WorkerNow add *bin* folder from *install* to system *PATH*: 354*6777b538SAndroid Build Coastguard Worker 355*6777b538SAndroid Build Coastguard Worker C:\Path\to>set PATH=%PATH%;C:\Path\to\install\bin 356*6777b538SAndroid Build Coastguard Worker 357*6777b538SAndroid Build Coastguard WorkerYou need reconfigure protobuf with flag `-Dprotobuf_WITH_ZLIB=ON` when invoking cmake. 358*6777b538SAndroid Build Coastguard Worker 359*6777b538SAndroid Build Coastguard WorkerNote that if you have compiled ZLIB yourself, as stated above, 360*6777b538SAndroid Build Coastguard Workerfurther disable the option `-Dprotobuf_MSVC_STATIC_RUNTIME=OFF`. 361*6777b538SAndroid Build Coastguard Worker 362*6777b538SAndroid Build Coastguard WorkerIf it reports NOTFOUND for zlib_include or zlib_lib, you might haven't put 363*6777b538SAndroid Build Coastguard Workerthe headers or the .lib file in the right directory. 364*6777b538SAndroid Build Coastguard Worker 365*6777b538SAndroid Build Coastguard WorkerIf you already have ZLIB library and headers at some other location on your system then alternatively you can define following configuration flags to locate them: 366*6777b538SAndroid Build Coastguard Worker 367*6777b538SAndroid Build Coastguard Worker -DZLIB_INCLUDE_DIR=<path to dir containing zlib headers> 368*6777b538SAndroid Build Coastguard Worker -DZLIB_LIB=<path to dir containing zlib> 369*6777b538SAndroid Build Coastguard Worker 370*6777b538SAndroid Build Coastguard WorkerBuild and testing protobuf as usual. 371*6777b538SAndroid Build Coastguard Worker 372*6777b538SAndroid Build Coastguard WorkerNotes on Compiler Warnings 373*6777b538SAndroid Build Coastguard Worker========================== 374*6777b538SAndroid Build Coastguard Worker 375*6777b538SAndroid Build Coastguard WorkerThe following warnings have been disabled while building the protobuf libraries 376*6777b538SAndroid Build Coastguard Workerand compiler. You may have to disable some of them in your own project as 377*6777b538SAndroid Build Coastguard Workerwell, or live with them. 378*6777b538SAndroid Build Coastguard Worker 379*6777b538SAndroid Build Coastguard Worker* C4244 - Conversion from 'type1' to 'type2', possible loss of data. 380*6777b538SAndroid Build Coastguard Worker* C4251 - 'identifier' : class 'type' needs to have dll-interface to be used by 381*6777b538SAndroid Build Coastguard Worker clients of class 'type2' 382*6777b538SAndroid Build Coastguard Worker* C4267 - Conversion from 'size_t' to 'type', possible loss of data. 383*6777b538SAndroid Build Coastguard Worker* C4305 - 'identifier' : truncation from 'type1' to 'type2' 384*6777b538SAndroid Build Coastguard Worker* C4355 - 'this' : used in base member initializer list 385*6777b538SAndroid Build Coastguard Worker* C4800 - 'type' : forcing value to bool 'true' or 'false' (performance warning) 386*6777b538SAndroid Build Coastguard Worker* C4996 - 'function': was declared deprecated 387*6777b538SAndroid Build Coastguard Worker 388*6777b538SAndroid Build Coastguard WorkerC4251 is of particular note, if you are compiling the Protocol Buffer library 389*6777b538SAndroid Build Coastguard Workeras a DLL (see previous section). The protocol buffer library uses templates in 390*6777b538SAndroid Build Coastguard Workerits public interfaces. MSVC does not provide any reasonable way to export 391*6777b538SAndroid Build Coastguard Workertemplate classes from a DLL. However, in practice, it appears that exporting 392*6777b538SAndroid Build Coastguard Workertemplates is not necessary anyway. Since the complete definition of any 393*6777b538SAndroid Build Coastguard Workertemplate is available in the header files, anyone importing the DLL will just 394*6777b538SAndroid Build Coastguard Workerend up compiling instances of the templates into their own binary. The 395*6777b538SAndroid Build Coastguard WorkerProtocol Buffer implementation does not rely on static template members being 396*6777b538SAndroid Build Coastguard Workerunique, so there should be no problem with this, but MSVC prints warning 397*6777b538SAndroid Build Coastguard Workernevertheless. So, we disable it. Unfortunately, this warning will also be 398*6777b538SAndroid Build Coastguard Workerproduced when compiling code which merely uses protocol buffers, meaning you 399*6777b538SAndroid Build Coastguard Workermay have to disable it in your code too. 400