Как правильно использовать сгенерированные источники protobuf?

Когда я пытаюсь использовать источники, сгенерированные protobuf, в мои флаги компиляции добавляется '-std= C++11' для цели, в которой я пытаюсь их использовать, что приводит к сбою компиляции (потому что я использую функции после C++11).
После довольно минимального примера. 3 файла, все в одном каталоге:

meson.build

project('test', 'cpp',
version : '0.1',
default_options : ['warning_level=3', 'cpp_std=c++17', 'werror=true']
)

protoc = find_program('protoc')
proto_dep = dependency('protobuf')

gen = generator(protoc,
  output    : ['@BASENAME@.pb.cc', '@BASENAME@.pb.h'],
  arguments : ['--proto_path=@CURRENT_SOURCE_DIR@', '--cpp_out=@BUILD_DIR@', '@INPUT@'])

generated = gen.process(['defs.proto'])

test_exe = executable(
  'test_exe',
  'main.cpp',
  generated,
  dependencies : proto_dep
)

main.cpp

#include "defs.pb.h"
#include <chrono>

int main()
{
  using namespace std::chrono_literals;
}

defs.proto

syntax = "proto2";

package messages;

message Person {
  required string node= 1;
  required string payload= 2;
}

После запуска meson build && ninja это терпит неудачу со следующей ошибкой:

[1/3] Compiling C++ object 'test_exe@exe/main.cpp.o'.
FAILED: test_exe@exe/main.cpp.o
c++ -Itest_exe@exe -I. -I.. -I/usr/local/include -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wnon-virtual-dtor -Wextra -Wpedantic -Werror -std=c++17 -g -pthread -g -std=c++11 -DNDEBUG  -MD -MQ 'test_exe@exe/main.cpp.o' -MF 'test_exe@exe/main.cpp.o.d' -o 'test_exe@exe/main.cpp.o' -c ../main.cpp
../main.cpp: In function ‘int main()’:
../main.cpp:6:24: error: ‘chrono_literals’ is not a namespace-name
   using namespace std::chrono_literals;
                        ^~~~~~~~~~~~~~~
../main.cpp:6:39: error: expected namespace-name before ‘;’ token
   using namespace std::chrono_literals;
                                       ^
[2/3] Compiling C++ object 'test...e/meson-generated_defs.pb.cc.o'.
ninja: build stopped: subcommand failed.

Вопрос в том, как исправить файлы meson.build так, чтобы исходники генерировались правильно и только std= флаг передается указан project( default_options?

1 ответ

Вы можете отключить все зависимости cxxflags с помощью

proto_dep = dependency('protobuf').partial_dependency(compile_args : false,
    link_args : true, links : true, includes : true, source : true)

Если какие-либо важные флаги будут отсутствовать, вы можете добавить их обратно вручную.

Так что я нашел грязное решение проблемы, вы можете заставить его скомпилировать, передав '-std= C++17' в cpp_args для цели в зависимости от protobuf.

proto_interface = declare_dependency(
  sources : generated,
  dependencies : proto_dep
)

test_exe = executable(
  'test_exe',
  'main.cpp',
  dependencies : proto_interface,
  cpp_args : ['-std=c++17']
)

Это не кажется очень чистым, так как есть 3 -std флаги переданы test_exe источники таким образом, как в приведенном ниже фрагменте из compile_commands.json:

 -std=c++17 -g -pthread -g -std=c++11 -DNDEBUG -std=c++17
Другие вопросы по тегам