Статическое связывание libpq postgresql в C

#c #postgresql #static #static-libraries #static-linking

#c #postgresql #статическое #статические библиотеки #статическое связывание

Вопрос:

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

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

Ответ №1:

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

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

Ответ №2:

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

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

Комментарии:

1. Я просто попытался скомпилировать библиотеку из исходного кода и получил libpq.a, который я затем связал с приложением для успешной компиляции. Однако я по-прежнему не могу запустить программу без .dll файлов. Я думаю, что есть какой-то #define I am missing или флаг компилятора. Обратите внимание, libpq.a это больше, чем libpq.lib .

2. libpq.a будет больше, чем libpq.lib поскольку оно содержит реализацию.