OLD | NEW |
(Empty) | |
| 1 This directory contains *CMake* files that can be used to build protobuf |
| 2 with *MSVC* on *Windows*. You can build the project from *Command Prompt* |
| 3 and using an *Visual Studio* IDE. |
| 4 |
| 5 You need to have [CMake](http://www.cmake.org), [Visual Studio](https://www.visu
alstudio.com) |
| 6 and optionally [Git](http://git-scm.com) installed on your computer before proce
eding. |
| 7 |
| 8 Most of the instructions will be given to the *Сommand Prompt*, but the same |
| 9 actions can be performed using appropriate GUI tools. |
| 10 |
| 11 Environment Setup |
| 12 ================= |
| 13 |
| 14 Open the appropriate *Command Prompt* from the *Start* menu. |
| 15 |
| 16 For example *VS2013 x64 Native Tools Command Prompt*: |
| 17 |
| 18 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64> |
| 19 |
| 20 Change to your working directory: |
| 21 |
| 22 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64>cd C:\Path\
to |
| 23 C:\Path\to> |
| 24 |
| 25 Where *C:\Path\to* is path to your real working directory. |
| 26 |
| 27 Create a folder where protobuf headers/libraries/binaries will be installed afte
r built: |
| 28 |
| 29 C:\Path\to>mkdir install |
| 30 |
| 31 If *cmake* command is not avaliable from *Command Prompt*, add it to system *PAT
H* variable: |
| 32 |
| 33 C:\Path\to>set PATH=%PATH%;C:\Program Files (x86)\CMake\bin |
| 34 |
| 35 If *git* command is not avaliable from *Command Prompt*, add it to system *PATH*
variable: |
| 36 |
| 37 C:\Path\to>set PATH=%PATH%;C:\Program Files\Git\cmd |
| 38 |
| 39 Good. Now you are ready to continue. |
| 40 |
| 41 Getting Sources |
| 42 =============== |
| 43 |
| 44 You can get the latest stable source packages from the |
| 45 [releases](https://github.com/google/protobuf/releases) page. |
| 46 Or you can type: |
| 47 |
| 48 C:\Path\to> git clone -b [release_tag] https://github.com/google/protobuf.g
it |
| 49 |
| 50 Where *[release_tag]* is a git tag like *v3.0.0-beta-1* or a branch name like *m
aster* |
| 51 if you want to get the latest code. |
| 52 |
| 53 Go to the project folder: |
| 54 |
| 55 C:\Path\to>cd protobuf |
| 56 C:\Path\to\protobuf> |
| 57 |
| 58 Protobuf unit-tests require gmock to build. If you download protobuf source code |
| 59 from the *releases* page, the *gmock* directory should already be there. If you
checkout |
| 60 the code via `git clone`, this *gmock* directory won't exist and you will have t
o |
| 61 download it manually or skip building protobuf unit-tests. |
| 62 |
| 63 You can download gmock as follows: |
| 64 |
| 65 C:\Path\to\protobuf>git clone -b release-1.7.0 https://github.com/google/go
oglemock.git gmock |
| 66 |
| 67 Then go to *gmock* folder and download gtest: |
| 68 |
| 69 C:\Path\to\protobuf>cd gmock |
| 70 C:\Path\to\protobuf\gmock>git clone -b release-1.7.0 https://github.com/goo
gle/googletest.git gtest |
| 71 |
| 72 If you absolutely don't want to build and run protobuf unit-tests, skip |
| 73 this steps and use protobuf at your own risk. |
| 74 |
| 75 Now go to *cmake* folder in protobuf sources: |
| 76 |
| 77 C:\Path\to\protobuf\gmock>cd ..\cmake |
| 78 C:\Path\to\protobuf\cmake> |
| 79 |
| 80 Good. Now you are ready to *CMake* configuration. |
| 81 |
| 82 CMake Configuration |
| 83 =================== |
| 84 |
| 85 *CMake* supports a lot of different |
| 86 [generators](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7.ht
ml) |
| 87 for various native build systems. |
| 88 We are only interested in |
| 89 [Makefile](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7.html
#makefile-generators) |
| 90 and |
| 91 [Visual Studio](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7
.html#visual-studio-generators) |
| 92 generators. |
| 93 |
| 94 We will use shadow building to separate the temporary files from the protobuf so
urce code. |
| 95 |
| 96 Create a temporary *build* folder and change your working directory to it: |
| 97 |
| 98 C:\Path\to\protobuf\cmake>mkdir build & cd build |
| 99 C:\Path\to\protobuf\cmake\build> |
| 100 |
| 101 The *Makefile* generator can build the project in only one configuration, so you
need to build |
| 102 a separate folder for each configuration. |
| 103 |
| 104 To start using a *Release* configuration: |
| 105 |
| 106 C:\Path\to\protobuf\cmake\build>mkdir release & cd release |
| 107 C:\Path\to\protobuf\cmake\build\release>cmake -G "NMake Makefiles" ^ |
| 108 -DCMAKE_BUILD_TYPE=Release ^ |
| 109 -DCMAKE_INSTALL_PREFIX=../../../../install ^ |
| 110 ../.. |
| 111 |
| 112 It will generate *nmake* *Makefile* in current directory. |
| 113 |
| 114 To use *Debug* configuration: |
| 115 |
| 116 C:\Path\to\protobuf\cmake\build>mkdir debug & cd debug |
| 117 C:\Path\to\protobuf\cmake\build\debug>cmake -G "NMake Makefiles" ^ |
| 118 -DCMAKE_BUILD_TYPE=Debug ^ |
| 119 -DCMAKE_INSTALL_PREFIX=../../../../install ^ |
| 120 ../.. |
| 121 |
| 122 It will generate *nmake* *Makefile* in current directory. |
| 123 |
| 124 To create *Visual Studio* solution file: |
| 125 |
| 126 C:\Path\to\protobuf\cmake\build>mkdir solution & cd solution |
| 127 C:\Path\to\protobuf\cmake\build\solution>cmake -G "Visual Studio 12 2013 Wi
n64" ^ |
| 128 -DCMAKE_INSTALL_PREFIX=../../../../install ^ |
| 129 ../.. |
| 130 |
| 131 It will generate *Visual Studio* solution file *protobuf.sln* in current directo
ry. |
| 132 |
| 133 If the *gmock* directory does not exist, and you do not want to build protobuf u
nit tests, |
| 134 you need to add *cmake* command argument `-Dprotobuf_BUILD_TESTS=OFF` to disable
testing. |
| 135 |
| 136 Compiling |
| 137 ========= |
| 138 |
| 139 To compile protobuf: |
| 140 |
| 141 C:\Path\to\protobuf\cmake\build\release>nmake |
| 142 |
| 143 or |
| 144 |
| 145 C:\Path\to\protobuf\cmake\build\debug>nmake |
| 146 |
| 147 And wait for the compilation to finish. |
| 148 |
| 149 If you prefer to use the IDE: |
| 150 |
| 151 * Open the generated protobuf.sln file in Microsoft Visual Studio. |
| 152 * Choose "Debug" or "Release" configuration as desired. |
| 153 * From the Build menu, choose "Build Solution". |
| 154 |
| 155 And wait for the compilation to finish. |
| 156 |
| 157 Testing |
| 158 ======= |
| 159 |
| 160 To run unit-tests: |
| 161 |
| 162 C:\Path\to\protobuf\cmake\build\release>nmake check |
| 163 |
| 164 or |
| 165 |
| 166 C:\Path\to\protobuf\cmake\build\debug>nmake check |
| 167 |
| 168 You can also build project *check* from Visual Studio solution. |
| 169 Yes, it may sound strange, but it works. |
| 170 |
| 171 You should see output similar to: |
| 172 |
| 173 Running main() from gmock_main.cc |
| 174 [==========] Running 1546 tests from 165 test cases. |
| 175 |
| 176 ... |
| 177 |
| 178 [==========] 1546 tests from 165 test cases ran. (2529 ms total) |
| 179 [ PASSED ] 1546 tests. |
| 180 |
| 181 To run specific tests: |
| 182 |
| 183 C:\Path\to\protobuf>cmake\build\release\tests.exe --gtest_filter=AnyTest* |
| 184 Running main() from gmock_main.cc |
| 185 Note: Google Test filter = AnyTest* |
| 186 [==========] Running 3 tests from 1 test case. |
| 187 [----------] Global test environment set-up. |
| 188 [----------] 3 tests from AnyTest |
| 189 [ RUN ] AnyTest.TestPackAndUnpack |
| 190 [ OK ] AnyTest.TestPackAndUnpack (0 ms) |
| 191 [ RUN ] AnyTest.TestPackAndUnpackAny |
| 192 [ OK ] AnyTest.TestPackAndUnpackAny (0 ms) |
| 193 [ RUN ] AnyTest.TestIs |
| 194 [ OK ] AnyTest.TestIs (0 ms) |
| 195 [----------] 3 tests from AnyTest (1 ms total) |
| 196 |
| 197 [----------] Global test environment tear-down |
| 198 [==========] 3 tests from 1 test case ran. (2 ms total) |
| 199 [ PASSED ] 3 tests. |
| 200 |
| 201 Note that the tests must be run from the source folder. |
| 202 |
| 203 If all tests are passed, safely continue. |
| 204 |
| 205 Installing |
| 206 ========== |
| 207 |
| 208 To install protobuf to the specified *install* folder: |
| 209 |
| 210 C:\Path\to\protobuf\cmake\build\release>nmake install |
| 211 |
| 212 or |
| 213 |
| 214 C:\Path\to\protobuf\cmake\build\debug>nmake install |
| 215 |
| 216 You can also build project *INSTALL* from Visual Studio solution. |
| 217 It sounds not so strange and it works. |
| 218 |
| 219 This will create the following folders under the *install* location: |
| 220 * bin - that contains protobuf *protoc.exe* compiler; |
| 221 * inclue - that contains C++ headers and protobuf *.proto files; |
| 222 * lib - that contains linking libraries and *CMake* configuration files for *p
rotobuf* package. |
| 223 |
| 224 Now you can if needed: |
| 225 * Copy the contents of the include directory to wherever you want to put heade
rs. |
| 226 * Copy protoc.exe wherever you put build tools (probably somewhere in your PAT
H). |
| 227 * Copy linking libraries libprotobuf[d].lib, libprotobuf-lite[d].lib, and libp
rotoc[d].lib wherever you put libraries. |
| 228 |
| 229 To avoid conflicts between the MSVC debug and release runtime libraries, when |
| 230 compiling a debug build of your application, you may need to link against a |
| 231 debug build of libprotobufd.lib with "d" postfix. Similarly, release builds sho
uld link against |
| 232 release libprotobuf.lib library. |
| 233 |
| 234 DLLs vs. static linking |
| 235 ======================= |
| 236 |
| 237 Static linking is now the default for the Protocol Buffer libraries. Due to |
| 238 issues with Win32's use of a separate heap for each DLL, as well as binary |
| 239 compatibility issues between different versions of MSVC's STL library, it is |
| 240 recommended that you use static linkage only. However, it is possible to |
| 241 build libprotobuf and libprotoc as DLLs if you really want. To do this, |
| 242 do the following: |
| 243 |
| 244 * Add an additional flag `-Dprotobuf_BUILD_SHARED_LIBS=ON` when invoking cmake |
| 245 * Follow the same steps as described in the above section. |
| 246 * When compiling your project, make sure to `#define PROTOBUF_USE_DLLS`. |
| 247 |
| 248 When distributing your software to end users, we strongly recommend that you |
| 249 do NOT install libprotobuf.dll or libprotoc.dll to any shared location. |
| 250 Instead, keep these libraries next to your binaries, in your application's |
| 251 own install directory. C++ makes it very difficult to maintain binary |
| 252 compatibility between releases, so it is likely that future versions of these |
| 253 libraries will *not* be usable as drop-in replacements. |
| 254 |
| 255 If your project is itself a DLL intended for use by third-party software, we |
| 256 recommend that you do NOT expose protocol buffer objects in your library's |
| 257 public interface, and that you statically link protocol buffers into your |
| 258 library. |
| 259 |
| 260 ZLib support |
| 261 ============ |
| 262 |
| 263 If you want to include GzipInputStream and GzipOutputStream |
| 264 (google/protobuf/io/gzip_stream.h) in libprotobuf, you will need to do a few |
| 265 additional steps. |
| 266 |
| 267 Obtain a copy of the zlib library. The pre-compiled DLL at zlib.net works. |
| 268 You need prepare it: |
| 269 |
| 270 * Make sure zlib's two headers are in your `C:\Path\to\install\include` path |
| 271 * Make sure zlib's linking libraries (*.lib file) is in your |
| 272 `C:\Path\to\install\lib` library path. |
| 273 |
| 274 You can also compile it from source by yourself. |
| 275 |
| 276 Getting sources: |
| 277 |
| 278 C:\Path\to>git clone -b v1.2.8 https://github.com/madler/zlib.git |
| 279 C:\Path\to>cd zlib |
| 280 |
| 281 Compiling and Installing: |
| 282 |
| 283 C:\Path\to\zlib>mkdir build & cd build |
| 284 C:\Path\to\zlib\build>mkdir release & cd release |
| 285 C:\Path\to\zlib\build\release>cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE
=Release ^ |
| 286 -DCMAKE_INSTALL_PREFIX=../../../install ../.. |
| 287 C:\Path\to\zlib\build\release>nmake & nmake install |
| 288 |
| 289 You can make *debug* version or use *Visual Studio* generator also as before for
the |
| 290 protobuf project. |
| 291 |
| 292 Now add *bin* folder from *install* to system *PATH*: |
| 293 |
| 294 C:\Path\to>set PATH=%PATH%;C:\Path\to\install\bin |
| 295 |
| 296 You need reconfigure protobuf with flag `-Dprotobuf_WITH_ZLIB=ON` when invoking
cmake. |
| 297 |
| 298 Note that if you have compiled ZLIB yourself, as stated above, |
| 299 further disable the option `-Dprotobuf_MSVC_STATIC_RUNTIME=OFF`. |
| 300 |
| 301 If it reports NOTFOUND for zlib_include or zlib_lib, you might haven't put |
| 302 the headers or the .lib file in the right directory. |
| 303 |
| 304 Build and testing protobuf as usual. |
| 305 |
| 306 Notes on Compiler Warnings |
| 307 ========================== |
| 308 |
| 309 The following warnings have been disabled while building the protobuf libraries |
| 310 and compiler. You may have to disable some of them in your own project as |
| 311 well, or live with them. |
| 312 |
| 313 * C4018 - 'expression' : signed/unsigned mismatch |
| 314 * C4146 - unary minus operator applied to unsigned type, result still unsigned |
| 315 * C4244 - Conversion from 'type1' to 'type2', possible loss of data. |
| 316 * C4251 - 'identifier' : class 'type' needs to have dll-interface to be used by |
| 317 clients of class 'type2' |
| 318 * C4267 - Conversion from 'size_t' to 'type', possible loss of data. |
| 319 * C4305 - 'identifier' : truncation from 'type1' to 'type2' |
| 320 * C4355 - 'this' : used in base member initializer list |
| 321 * C4800 - 'type' : forcing value to bool 'true' or 'false' (performance warning) |
| 322 * C4996 - 'function': was declared deprecated |
| 323 |
| 324 C4251 is of particular note, if you are compiling the Protocol Buffer library |
| 325 as a DLL (see previous section). The protocol buffer library uses templates in |
| 326 its public interfaces. MSVC does not provide any reasonable way to export |
| 327 template classes from a DLL. However, in practice, it appears that exporting |
| 328 templates is not necessary anyway. Since the complete definition of any |
| 329 template is available in the header files, anyone importing the DLL will just |
| 330 end up compiling instances of the templates into their own binary. The |
| 331 Protocol Buffer implementation does not rely on static template members being |
| 332 unique, so there should be no problem with this, but MSVC prints warning |
| 333 nevertheless. So, we disable it. Unfortunately, this warning will also be |
| 334 produced when compiling code which merely uses protocol buffers, meaning you |
| 335 may have to disable it in your code too. |
OLD | NEW |