встроенный в vcpkg google protobuf и grp c не будут статически связываться с приложением - PullRequest
0 голосов
/ 04 апреля 2020

Инструменты и версии: Visual Sudio 2017, Google Protobufs 3.11.3, gRP C 1.27.1, vcpkg 2020.02.04, в Microsoft Windows

Я использовал vcpkg для сборки Windows нативные C ++ версии gRP C и protobuf (и другие зависимости) для Windows (x86). Все строится успешно.

Когда я создаю свое приложение, я включаю "libprotobuf.lib" в качестве входных данных компоновщика. Тем не менее, это не связано. Вместо этого моя программа будет работать только в том случае, если для загрузки программы присутствует «libprotobuf.dll». Я не знаю другого способа указать, что библиотека должна быть статически связана.

Во время сборки моего приложения я вижу много предупреждений, подобных этому: include \ google \ protobuf \ duration.pb. h (220): предупреждение C4251: 'google :: protobuf :: Duration :: _ internal_metadata_': class 'google :: protobuf :: internal :: InternalMetadataWithArena' должен иметь dll-интерфейс для использования клиентами класса 'google: * ссылаться на библиотеку по-другому.

Я также видел эту страницу , которая предлагает решение. Это немного помогло. Это заставляло Visual Studio распознавать неразрешенные внешние объекты, поэтому, по крайней мере, оно пыталось статически связать файлы .lib. Имея это в виду, я попробовал различные комбинации файлов .lib для protobuf, grp c и зависимостей, но все еще не могу получить успешную сборку - и предупреждения компилятора по-прежнему генерируются.

I я чувствую, что во время сборки vcpkg что-то упускается (возможно, определение препроцессора), что могло бы по-разному создавать заголовки или библиотеки. Я пытался изменить некоторые параметры сборки, но они всегда перезаписывались, когда vcpkg генерирует файлы cmake для сборки.

Или мне не хватает правильной комбинации библиотечных файлов для ссылки из моего проекта.

Кто-нибудь заставил это работать? Если у вас есть примеры создания библиотек для статического связывания c через vcpkg или правильный способ связать библиотеки в проекте VS2017, не могли бы вы поделиться своей информацией?

1 Ответ

0 голосов
/ 24 апреля 2020

Наконец-то появилась возможность вернуться к этому. Проблема сводилась к двум вещам: 1. Понимая, что вы можете указать триплет (как отмечено в оригинальном вопросе). 2. Наконец, использование библиотек stati c также означало, что мне пришлось переключить свое приложение на библиотеки времени исполнения stati c c вместо общих библиотек.

Я не могу переключить свое приложение. Я все же провел тестирование с использованием этой операции в нестатическом режиме c. Я не видел никаких проблем, но кто-нибудь еще использует protobufs (и gRP C таким образом) - это не рекомендуется.

...