Статическое связывание libpq ++ postgresql в C ++ - PullRequest
3 голосов
/ 10 ноября 2011

Я перемещаю приложение из MySQL в Postgres. Когда я пытаюсь скомпилировать простое приложение, которое подключается к базе данных, я могу связать его с libpq.lib и успешно выполнить компиляцию и выполнение. Тем не менее, это требует, чтобы я включил около 8 .dll файлов в каталог моей программы, что очень усугубляет. Есть ли способ статически связать libpq.lib, чтобы мне не нужны файлы .dll? Я нахожусь на Windows7 x64, и я пытаюсь нацелить создание независимого от архитектуры приложения, которое работает на окнах x64 и x86. Я использую libpq версии 8.4.9.1. Спасибо!

Обновление: я попытался добавить #define PQ_STATIC и -static к флагам компоновщика. Я также скомпилировал libpq.a из исходного кода, но ничего из вышеперечисленного не сработало.

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

Libpq нужны некоторые довольно большие библиотеки, такие как openssl для зашифрованных соединений, zlib для сжатия, iconv для преобразования наборов символов и т. Д. Вам нужно будет скомпилировать все из них в статическую библиотеку, затем libpq в статическую библиотеку и затем вашу программу статически.Я думаю, что это слишком много работы для слишком малого выигрыша.

Есть коммерческий инструмент, PgWare Alloy 4 , который можно использовать для объединения DLL с EXE.Я предполагаю, что он просто извлекает все объединенные файлы во временный каталог, а затем запускает вашу программу из этого каталога.

1 голос
/ 11 ноября 2011

В общем, есть два вида библиотек.Один скомпилирован для динамического связывания, а другой для статического связывания.В вашем случае вы можете ссылаться на библиотеку, скомпилированную для динамического связывания.Итак, вам нужна библиотека для статической компоновки.Во многих случаях такой файл называется *_s.lib, обозначающим статически связываемую библиотеку.

В Linux .a файлы - это статические библиотеки.После того, как вы свяжетесь с ними, они вам не понадобятся во время выполнения.В то время как в Windows вы всегда компилируете и связываете файлы .lib.На этапе компиляции вы не найдете никакой разницы.Некоторые из этих .lib файлов содержат действительный код.Это статические библиотеки.Другие содержат указатель на реализацию в отдельном .dll.

...