Оказывается, статическое связывание работало, но только для библиотек Qt. Моя сторонняя библиотека QtSerialPort статически не связывается. После некоторого исследования я обнаружил, что мне нужно либо строить эту библиотеку статически, либо мне нужно напрямую ссылаться на файл .pri в моем файле .pro.
Я не уверен, как это сделать, так как кажется, что QtSerialPort не был разработан для статического связывания.
Метод .pri, которого я действительно не понимаю, и был смутно описан в этих двух ссылках:
http://qt-project.org/forums/viewthread/15223
http://www.qtcentre.org/archive/index.php/t-54505.html
У кого-нибудь есть какие-либо советы о том, как заставить любой из этих методов работать? Или, возможно, другой метод?
Кроме того, MSVCP100.dll не связывает статически, если кто-нибудь может дать мне какой-либо совет по этому поводу.
================================================== ================================
Я пытаюсь заставить Qt статически связывать библиотеки, чтобы я мог создать отдельное приложение. Я следовал различным учебникам о том, как построить Qt статически, а затем создать статическое приложение, но мне не очень повезло. Я считаю, что я успешно построил Qt со статической связью, потому что размер приложения увеличился с 79 КБ до 7 + МБ, но я все еще получаю сообщения об ошибках, в которых отсутствуют QtCore4.dll и QtSerialPort.dll. Кроме того, еще одна проблема, возникающая при использовании статической конфигурации, которая не слишком серьезна, заключается в том, что когда я закрываю свою программу, Windows думает, что она потерпела крах, и выдает окно с сообщением о том, что MyProgram.exe перестал работать …
Я на Windows-компьютере использую MSVC 2010 с Qt 4.8.5 и использую стороннюю библиотеку QtSerialPort.
Что я сделал в соответствии с руководствами, которые я читал:
Загрузите и распакуйте qt-everywhere-opensource-src-4.8.5.zip
Откройте /mkspec/mwin32-msvc2010/qmake.conf и измените следующие строки на
CONFIG += qt warn_on release incremental flat link_prl precompile_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target
а также
QMAKE_CLFAGS_RELEASE = -O2 -MT
Затем я открываю командную строку MSVC2010 и перехожу к этому. Затем я ввожу команды
configure -static -release -platform win32-msvc2010
nmake sub-src
После этого я открываю свой проект и добавляю
CONFIG += static
в файл .pro. Затем в QtCreator я захожу в проекты, управляю наборами, затем в версии Qt и просматриваю созданный мною qMake. Я добавляю новый комплект с этой версией qMake. Затем я очищаю все и переключаюсь на этот новый набор и запускаю qmake из QtCreator. Затем я использую командную строку msvc2010, чтобы перейти в каталог, где создаются файлы, а затем
nmake release
Это создает довольно большой .exe, но, как я уже сказал, это все еще зависит от пары .dll.
Для статического связывания с внешней библиотекой есть пара вариантов, оба имеют свои плюсы и минусы.
I. Соберите библиотеку для статического связывания самостоятельно. Ссылка на это.
Ищите возможные существующие конфигурационные переключатели для статического связывания. Там может быть что-то вроде QTSERIALPORT_STATIC = no
и т. д. в библиотеке .pro/.pri
файлы. Просто скажи yes
для библиотеки, чтобы скомпилировать статическое связывание и перейти к шагу 4!
В .pro/.pri
замена файла CONFIG += dll
с CONFIG += static
,
Удалить экспортные декларации из библиотеки. Обычно символы библиотеки Qt объявляются с определением вроде QTSERIALPORT_EXPORT
который расширяется до Q_DECL_EXPORT/Q_DECL_IMPORT
в сборке разделяемой библиотеки / использование ее заголовочных файлов при компоновке. Вам нужно найти где это QTSERIALPORT_EXPORT
определено и замените его пустым определением:
#define QTSERIALPORT_EXPORT // in source file
или же
DEFINES += QTSERIALPORT_EXPORT # in .pro/.pri file
Постройте библиотеку.
.lib/.a
файл, используйте заголовочные файлы библиотеки для объявлений символов в вашем проекте.II. Включите исходные файлы библиотеки в свой проект и скомпилируйте их в нем (вообще никаких ссылок).
Включите все исходные файлы библиотеки в свой проект (добавьте в SOURCES
в файле проекта qmake)
Определите все вещи, от которых зависит библиотека (другие библиотеки, опции Qt и т. Д.), И включите их также в свой .pro
файл.
ИЛИ ЖЕ
Включите правильное .pri
файл в ваш .pro
если автор библиотеки предоставляет его для компиляции в проекте (т.е. include(QtSerialPort.pri)
или что-то.)
Удалите объявления экспорта / импорта из исходного кода библиотеки — как описано в пункте 3 части I.
Создайте свой проект.
Других решений пока нет …