#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
поскольку оно содержит реализацию.