OLD | NEW |
| (Empty) |
1 This directory contains cmake files that can be used to generate MSVC project | |
2 files in order to build protobuf on windows. You need to have cmake installed | |
3 on your computer before proceeding. | |
4 | |
5 Compiling and Installing | |
6 ======================== | |
7 | |
8 1. Check whether a gmock directory exists in the upper level directory. If you | |
9 checkout the code from github via "git clone", this gmock directory won't | |
10 exist and you won't be able to build protobuf unit-tests. Consider using one | |
11 of the release tar balls instead: | |
12 | |
13 https://github.com/google/protobuf/releases | |
14 | |
15 These release tar balls are more stable versions of protobuf and already | |
16 have the gmock directory included. | |
17 | |
18 You can also download gmock by yourself and put it in the right place. | |
19 | |
20 If you absolutely don't want to build and run protobuf unit-tests, skip | |
21 this step and use protobuf at your own risk. | |
22 | |
23 2. Use cmake to generate MSVC project files. Running the following commands | |
24 in a command shell will generate project files for Visual Studio 2008 in | |
25 a sub-directory named "build". | |
26 | |
27 $ cd path/to/protobuf/cmake | |
28 $ mkdir build | |
29 $ cd build | |
30 $ cmake -G "Visual Studio 9 2008" .. | |
31 | |
32 If you don't have gmock, skip the build of tests by turning off the | |
33 BUILD_TESTING option: | |
34 | |
35 $ cmake -G "Visual Studio 9 2008" -DBUILD_TESTING=OFF .. | |
36 | |
37 3. Open the generated protobuf.sln file in Microsoft Visual Studio. | |
38 4. Choose "Debug" or "Release" configuration as desired. | |
39 5. From the Build menu, choose "Build Solution". Wait for compiling to finish. | |
40 6. If you have built tests, run tests.exe and lite-test.exe from a command | |
41 shell and check that all tests pass. Make sure you have changed the working | |
42 directory to the output directory because tests.exe will try to find and run | |
43 test_plugin.exe in the working directory. | |
44 7. Run extract_includes.bat to copy all the public headers into a separate | |
45 "include" directory. This batch script can be found along with the generated | |
46 protobuf.sln file in the same directory. | |
47 8. Copy the contents of the include directory to wherever you want to put | |
48 headers. | |
49 9. Copy protoc.exe wherever you put build tools (probably somewhere in your | |
50 PATH). | |
51 10. Copy libprotobuf.lib, libprotobuf-lite.lib, and libprotoc.lib wherever you | |
52 put libraries. | |
53 | |
54 To avoid conflicts between the MSVC debug and release runtime libraries, when | |
55 compiling a debug build of your application, you may need to link against a | |
56 debug build of libprotobuf.lib. Similarly, release builds should link against | |
57 release libs. | |
58 | |
59 DLLs vs. static linking | |
60 ======================= | |
61 | |
62 Static linking is now the default for the Protocol Buffer libraries. Due to | |
63 issues with Win32's use of a separate heap for each DLL, as well as binary | |
64 compatibility issues between different versions of MSVC's STL library, it is | |
65 recommended that you use static linkage only. However, it is possible to | |
66 build libprotobuf and libprotoc as DLLs if you really want. To do this, | |
67 do the following: | |
68 | |
69 1. Add an additional flag "-DBUILD_SHARED_LIBS=ON" when invoking cmake: | |
70 | |
71 $ cmake -G "Visual Studio 9 2008" -DBUILD_SHARED_LIBS=ON .. | |
72 | |
73 2. Follow the same steps as described in the above section. | |
74 3. When compiling your project, make sure to #define PROTOBUF_USE_DLLS. | |
75 | |
76 When distributing your software to end users, we strongly recommend that you | |
77 do NOT install libprotobuf.dll or libprotoc.dll to any shared location. | |
78 Instead, keep these libraries next to your binaries, in your application's | |
79 own install directory. C++ makes it very difficult to maintain binary | |
80 compatibility between releases, so it is likely that future versions of these | |
81 libraries will *not* be usable as drop-in replacements. | |
82 | |
83 If your project is itself a DLL intended for use by third-party software, we | |
84 recommend that you do NOT expose protocol buffer objects in your library's | |
85 public interface, and that you statically link protocol buffers into your | |
86 library. | |
87 | |
88 ZLib support | |
89 ============ | |
90 | |
91 If you want to include GzipInputStream and GzipOutputStream | |
92 (google/protobuf/io/gzip_stream.h) in libprotobuf, you will need to do a few | |
93 additional steps: | |
94 | |
95 1. Obtain a copy of the zlib library. The pre-compiled DLL at zlib.net works. | |
96 2. Make sure zlib's two headers are in your include path and that the .lib file | |
97 is in your library path. You could place all three files directly into this | |
98 cmake directory to compile libprotobuf, but they need to be visible to | |
99 your own project as well, so you should probably just put them into the | |
100 VC shared icnlude and library directories. | |
101 3. Add flag "-DZLIB=ON" when invoking cmake: | |
102 | |
103 $ cmake -G "Visual Studio 9 2008" -DZLIB=ON .. | |
104 | |
105 If it reports NOTFOUND for zlib_include or zlib_lib, you might haven't put | |
106 the headers or the .lib file in the right directory. | |
107 4) Open the generated protobuf.sln file and build as usual. | |
108 | |
109 Notes on Compiler Warnings | |
110 ========================== | |
111 | |
112 The following warnings have been disabled while building the protobuf libraries | |
113 and compiler. You may have to disable some of them in your own project as | |
114 well, or live with them. | |
115 | |
116 * C4018 - 'expression' : signed/unsigned mismatch | |
117 * C4146 - unary minus operator applied to unsigned type, result still unsigned | |
118 * C4244 - Conversion from 'type1' to 'type2', possible loss of data. | |
119 * C4251 - 'identifier' : class 'type' needs to have dll-interface to be used by | |
120 clients of class 'type2' | |
121 * C4267 - Conversion from 'size_t' to 'type', possible loss of data. | |
122 * C4305 - 'identifier' : truncation from 'type1' to 'type2' | |
123 * C4355 - 'this' : used in base member initializer list | |
124 * C4800 - 'type' : forcing value to bool 'true' or 'false' (performance warning) | |
125 * C4996 - 'function': was declared deprecated | |
126 | |
127 C4251 is of particular note, if you are compiling the Protocol Buffer library | |
128 as a DLL (see previous section). The protocol buffer library uses templates in | |
129 its public interfaces. MSVC does not provide any reasonable way to export | |
130 template classes from a DLL. However, in practice, it appears that exporting | |
131 templates is not necessary anyway. Since the complete definition of any | |
132 template is available in the header files, anyone importing the DLL will just | |
133 end up compiling instances of the templates into their own binary. The | |
134 Protocol Buffer implementation does not rely on static template members being | |
135 unique, so there should be no problem with this, but MSVC prints warning | |
136 nevertheless. So, we disable it. Unfortunately, this warning will also be | |
137 produced when compiling code which merely uses protocol buffers, meaning you | |
138 may have to disable it in your code too. | |
139 | |
OLD | NEW |