2013-01-16 1 views
4

Когда я называю protoc как этотЗаголовок включают путь в файлы, созданные с помощью `protoc`

protoc --cpp_out=. path/to/test.proto 

файлы

  • path/to/test.pb.cc и
  • path/to/test.pb.h

генерируются что что я хочу. Но, так как cc нуждается в h, то h включен как этот

#include "path/to/test.pb.h" 

, который не то, что я хочу. Фон заключается в том, что мой инструмент построения (scons) вызывает protoc из корня проекта, а не из каталога, который включает в себя исходные файлы. Я не нашел очевидного варианта в man-странице или в тексте справки.

Итак, моя следующая идея состояла в том, чтобы считать это «правильным» и настроить мою систему сборки, но: Эти два файла являются братьями и сестрами в дереве каталогов, поэтому, когда один включает другой, путь не требуется. Даже компиляция вручную не выполняется.

Может кто-нибудь помочь мне в этом?

ответ

-1

То, что я в конечном итоге делает для моего проекта заключается в следующем:

  1. Создание каталога pb/ на том же уровне, что и ваши include/ и src/ каталогов.

  2. Вставьте здесь свои файлы .proto и создайте файл makefile. Напишите в нем следующее:

    CXX = g++ 
    CXXFLAGS = -O3 
    
    PROTOBF = $(shell find ./ -name '*.proto') 
    SOURCES = $(subst proto,pb.cc,$(PROTOBF)) 
    OBJECTS = $(subst proto,pb.o,$(PROTOBF)) 
    
    default: $(OBJECTS) 
        @echo -n 
    
    $(SOURCES): %.pb.cc : %.proto 
        protoc --cpp_out=. $< 
    
    $(OBJECTS): %.pb.o : %.pb.cc 
        $(CXX) $(CXXFLAGS) -c $< -o [email protected] 
    

    Что будет генерировать и строить файлы protobuffer при вызове.

  3. В вашем основном make-файле просто добавьте следующий путь include: -Ipb/.

    И при включении заголовка буфера протокола используйте #include <whatever.pb.h>.

  4. Добавить объектные файлы, сгенерированные в pb/, на ваш этап связывания. Сам я использовал:

    PB_OBJS = $(shell find pb/ -name '*.pb.o') 
    

    И дал, что линкер вместе с обычными файлами объекта в obj/.


Тогда, вероятно, можно назвать pb/ Makefile из главного Makefile, если вы хотите автоматизировать. Важным моментом является то, что protoc будет вызван из каталога pb/, или включение будет испорчено.

Извините за уродливые make-файлы. По крайней мере, это работает, и я надеюсь, что это поможет вам ...

1

Выполнение поиска на сгенерированных файлах, скорее всего, проще , чем реорганизация вашей системы сборки (используйте команду sed в Linux/unix).