{"id":3919,"date":"2019-10-13T02:58:36","date_gmt":"2019-10-12T18:58:36","guid":{"rendered":"https:\/\/damogame.cn\/wordpress\/?p=3919"},"modified":"2019-10-13T02:58:36","modified_gmt":"2019-10-12T18:58:36","slug":"cmake-and-protocol-buffers-on-windows","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/3919","title":{"rendered":"CMake and Protocol Buffers on Windows"},"content":{"rendered":"<p><a href=\"https:\/\/yangcha.github.io\/Protobuf-CMake\/\">\u539f\u6587\u5730\u5740<\/a><\/p>\n<p>&nbsp;<\/p>\n<div class=\"date\">Friday, May 25, 2018<\/div>\n<div class=\"entry\">\n<p><a href=\"https:\/\/developers.google.com\/protocol-buffers\/\">Protocol buffers<\/a>\u00a0are Google\u2019s language-neutral, platform-neutral approach for serializing structured data.<\/p>\n<p>On linux, you can easily install it using package management. On Windows, you may build it from source and install it.\u00a0<a href=\"https:\/\/github.com\/google\/protobuf\/blob\/master\/cmake\/README.md\">Here<\/a>\u00a0is the instructions to install it on Windows.<\/p>\n<p>Suppose it is installed under the install location, such as\u00a0<code class=\"highlighter-rouge\">d:\\pgk\\protobuf<\/code>, the directory structure is as follows:<\/p>\n<pre><code class=\"language-dos\">+---bin\r\n+---cmake\r\n+---include\r\n|   \\---google\r\n|       \\---protobuf\r\n|           +---compiler\r\n|           |   +---cpp\r\n|           |   +---csharp\r\n|           |   +---java\r\n|           |   +---javanano\r\n|           |   +---js\r\n|           |   +---objectivec\r\n|           |   +---php\r\n|           |   +---python\r\n|           |   \\---ruby\r\n|           +---io\r\n|           +---stubs\r\n|           \\---util\r\n\\---lib\r\n    \\---pkgconfig \r\n<\/code><\/pre>\n<h1 id=\"cmake\">CMake<\/h1>\n<p><a href=\"https:\/\/cmake.org\/\">CMake<\/a>\u00a0is an excellent tool for building, testing and packaging. The following example shows how to use Protocol buffers in your project:<\/p>\n<div class=\"language-cmake highlighter-rouge\">\n<div class=\"highlight\">\n<pre class=\"highlight\"><code><span class=\"nb\">find_package<\/span><span class=\"p\">(<\/span>Protobuf REQUIRED<span class=\"p\">)<\/span>\r\n<span class=\"nb\">include_directories<\/span><span class=\"p\">(<\/span><span class=\"si\">${<\/span><span class=\"nv\">Protobuf_INCLUDE_DIRS<\/span><span class=\"si\">}<\/span><span class=\"p\">)<\/span>\r\n<span class=\"nb\">include_directories<\/span><span class=\"p\">(<\/span><span class=\"si\">${<\/span><span class=\"nv\">CMAKE_CURRENT_BINARY_DIR<\/span><span class=\"si\">}<\/span><span class=\"p\">)<\/span>\r\n<span class=\"nf\">protobuf_generate_cpp<\/span><span class=\"p\">(<\/span>PROTO_SRCS PROTO_HDRS foo.proto<span class=\"p\">)<\/span>\r\n<span class=\"nf\">protobuf_generate_cpp<\/span><span class=\"p\">(<\/span>PROTO_SRCS PROTO_HDRS EXPORT_MACRO DLL_EXPORT foo.proto<span class=\"p\">)<\/span>\r\n<span class=\"nf\">protobuf_generate_cpp<\/span><span class=\"p\">(<\/span>PROTO_SRCS PROTO_HDRS DESCRIPTORS PROTO_DESCS foo.proto<span class=\"p\">)<\/span>\r\n<span class=\"nf\">protobuf_generate_python<\/span><span class=\"p\">(<\/span>PROTO_PY foo.proto<span class=\"p\">)<\/span>\r\n<span class=\"nb\">add_executable<\/span><span class=\"p\">(<\/span>bar bar.cc <span class=\"si\">${<\/span><span class=\"nv\">PROTO_SRCS<\/span><span class=\"si\">}<\/span> <span class=\"si\">${<\/span><span class=\"nv\">PROTO_HDRS<\/span><span class=\"si\">}<\/span><span class=\"p\">)<\/span>\r\n<span class=\"nb\">target_link_libraries<\/span><span class=\"p\">(<\/span>bar <span class=\"si\">${<\/span><span class=\"nv\">Protobuf_LIBRARIES<\/span><span class=\"si\">}<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p>However, the above CMake script will fail due to the error: \u201cprotobuf not found\u201d. To let CMake successfully find the installed protobuf package, you can specify the install location as follows:<\/p>\n<div class=\"language-cmake highlighter-rouge\">\n<div class=\"highlight\">\n<pre class=\"highlight\"><code><span class=\"nb\">set<\/span><span class=\"p\">(<\/span>CMAKE_PREFIX_PATH\r\n\t<span class=\"s2\">\"d:\/pkg\/protobuf\"<\/span>\r\n\t<span class=\"s2\">\"<\/span><span class=\"si\">${<\/span><span class=\"nv\">CMAKE_PREFIX_PATH<\/span><span class=\"si\">}<\/span><span class=\"s2\">\"<\/span>\r\n\t<span class=\"p\">)<\/span>\r\n \r\n<span class=\"nb\">find_package<\/span><span class=\"p\">(<\/span>Protobuf REQUIRED<span class=\"p\">)<\/span>\r\n<span class=\"nb\">include_directories<\/span><span class=\"p\">(<\/span><span class=\"si\">${<\/span><span class=\"nv\">Protobuf_INCLUDE_DIRS<\/span><span class=\"si\">}<\/span><span class=\"p\">)<\/span>\r\n<span class=\"nb\">include_directories<\/span><span class=\"p\">(<\/span><span class=\"si\">${<\/span><span class=\"nv\">CMAKE_CURRENT_BINARY_DIR<\/span><span class=\"si\">}<\/span><span class=\"p\">)<\/span>\r\n<span class=\"nf\">protobuf_generate_cpp<\/span><span class=\"p\">(<\/span>PROTO_SRCS PROTO_HDRS foo.proto<span class=\"p\">)<\/span>\r\n<span class=\"nf\">protobuf_generate_cpp<\/span><span class=\"p\">(<\/span>PROTO_SRCS PROTO_HDRS EXPORT_MACRO DLL_EXPORT foo.proto<span class=\"p\">)<\/span>\r\n<span class=\"nf\">protobuf_generate_cpp<\/span><span class=\"p\">(<\/span>PROTO_SRCS PROTO_HDRS DESCRIPTORS PROTO_DESCS foo.proto<span class=\"p\">)<\/span>\r\n<span class=\"nf\">protobuf_generate_python<\/span><span class=\"p\">(<\/span>PROTO_PY foo.proto<span class=\"p\">)<\/span>\r\n<span class=\"nb\">add_executable<\/span><span class=\"p\">(<\/span>bar bar.cc <span class=\"si\">${<\/span><span class=\"nv\">PROTO_SRCS<\/span><span class=\"si\">}<\/span> <span class=\"si\">${<\/span><span class=\"nv\">PROTO_HDRS<\/span><span class=\"si\">}<\/span><span class=\"p\">)<\/span>\r\n<span class=\"nb\">target_link_libraries<\/span><span class=\"p\">(<\/span>bar <span class=\"si\">${<\/span><span class=\"nv\">Protobuf_LIBRARIES<\/span><span class=\"si\">}<\/span><span class=\"p\">)<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u6587\u5730\u5740 &nbsp; Friday, <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[],"tags":[118],"class_list":["post-3919","post","type-post","status-publish","format-standard","hentry","tag-02-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/3919","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=3919"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/3919\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=3919"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=3919"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=3919"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}