Как установить протобуф на виндовс? (Win7x64/минГВт)

C++-Protobuf не компилируется в VS2012. Теперь я хочу использовать MinGW для его компиляции в Windows. Может кто-нибудь дать мне несколько кратких заголовков о том, как скомпилировать protobuf на Win7 x64. Я уже установил MinGW с помощью установщика с графическим интерфейсом. Google пишет в качестве уведомления о настройке MinGW, что я должен обратиться к примечаниям по установке Unix. Но я не могу понять, как использовать автоматические инструменты в Windows.

Изменить

Хорошо, это то, что я сделал до сих пор:

$ mount C:/ WinDir
$ cd ./[...]/protobuf.2.4.1
$ ./configure
$ minGW32-make.exe
$ minGW32-make.exe check

minGW32-make.exe работает без ошибок, но тесты не выполняются, и я не могу найти libprotobuf.lib. Есть несколько libprotobuf.dll, но мне нужна библиотека, не так ли?


person ManuelSchneid3r    schedule 28.11.2012    source источник


Ответы (3)


У вас должна быть консоль MSys вместе с вашей установкой MinGW. Эта консоль предоставляет Linux-подобную среду, в которой вы сможете нормально использовать автоинструменты.

Если MSys не установлен, вы также можете загрузить его с сайта MinGW.

cd в свою директорию с исходниками и попробуйте как обычно:

$ ./configure
$ make

Некоторые библиотеки вызывают проблемы в Windows, но большинство из них хорошо компилируются с MinGW и MSys. Вернитесь и добавьте больше информации к своему вопросу, если у вас возникнут определенные проблемы.


Редактировать:

minGW32-make.exe работает без ошибок, но тесты не выполняются, и я не могу найти libprotobuf.lib. Есть несколько libprotobuf.dll, но мне нужна библиотека, не так ли?

Обычно для динамической библиотеки вы получаете protobuf.dll (динамическая библиотека) и libprotobuf.a (статическая библиотека-оболочка).

При связывании просто передайте компоновщику -lprotobuf — он будет искать и libprotobuf.a, и protobuf.lib.

(.lib — это еще один формат статической библиотеки, который частично обрабатывается MinGW, но здесь не является родным.)

person Kos    schedule 29.11.2012
comment
Разве это не то, что сделал ОП? - person Marcus Riemer; 29.11.2012
comment
Возможно, так оно и было, чего я не мог знать до того, как он отредактировал сообщение. - person Kos; 29.11.2012
comment
Упс, ОП отредактировал это после того, как вы опубликовали. Извини за это! Судя по всему, голосование было заблокировано, поэтому, если вы внесете в него небольшое изменение, я, конечно же, пересмотрю свой отрицательный голос! - person Marcus Riemer; 29.11.2012

Вы не будете работать с файлом .lib при использовании цепочки инструментов MinGW. Вместо этого вы можете напрямую связываться с dll. Вики MinGW объясняет это.

person Marcus Riemer    schedule 29.11.2012
comment
+1 за хорошую ссылку. Но я предполагаю, что прямое связывание с DLL будет связывать ее статически, а не динамически, это правильно? IIRC для динамического связывания вы либо загружаете библиотеку вручную или используйте статическую оболочку, которая сделает это за вас - это то, что libNAME.a обертки, сгенерированные вместе с DLL, делают под капотом. - person Kos; 29.11.2012
comment
Я не уверен, можно ли автоматически сгенерировать код загрузчика, просто передав DLL компоновщику с некоторым флагом; Можешь подтвердить? - person Kos; 29.11.2012
comment
Это зависит от того, как именно он связывается. Я делаю это, как указано в Wiki, вызывая g++ -o example_exe.exe example_exe.o example_dll.dll, который не требует какой-либо входной библиотеки. - person Marcus Riemer; 29.11.2012
comment
Ага, похоже работает. Спасибо за указание на это. Интересно, какие библиотеки DLL поддерживаются таким образом (например, они тоже могут быть библиотеками C из MSVC?). - person Kos; 29.11.2012
comment
Нет, это будет работать только с DLL, созданными набором инструментов MinGW. Это обычный способ связывания с библиотеками (в данном случае .so) в системах *NIX, а MinGW отражает это в Windows. - person Marcus Riemer; 29.11.2012

Я мог бы получить dll и lib оба. Это когда вам не нужен статический файл lib и вы хотите использовать dll и файл lib. Вам необходимо внести следующие изменения в код Protobuf:

  1. Откройте проект в VS. Или любой другой редактор. Я использую VS2015.
  2. В настройках проекта libProtoBuf в препроцессоре C/C++ добавьте следующие флаги. PROTOBUF_USE_DLLS; LIBPROTOBUF_EXPORTS; Эти флаги будут экспортировать информацию из profobuf с помощью dllexport.

  3. в вашем клиентском коде, где вы используете Protobuf, определите: PROTOBUF_USE_DLLS. Это заставит protobuf использовать dllimport.

Выполнив шаг 2, вы увидите и dll, и lib в выходной папке. В противном случае вы всегда будете видеть только dll, а не файл lib.

Надеюсь это поможет. Если нет, пожалуйста, напишите сообщение здесь, и я могу помочь вам разобраться в этом.

person Mahendra Vengurlekar    schedule 24.03.2017