2013-12-12 2 views
5

Оказывается, статическая связь работает, но только для библиотек Qt. Моя сторонняя библиотека QtSerialPort не связывает статически. После некоторого повторного поиска, я обнаружил, что мне либо нужно собрать эту библиотеку статически, либо мне нужно напрямую связать файл .pri в моем .pro-файле.Qt Сторонняя библиотека Статическая связь (QtSerialPort)

Я не уверен, как это сделать, так как кажется, что QtSialialPort не был предназначен для статического соединения.

.При метод, который я действительно не понимаю, и было неясно описано в этих двух звеньях: http://qt-project.org/forums/viewthread/15223 http://www.qtcentre.org/archive/index.php/t-54505.html

Кто-нибудь есть какие-либо adivce о том, как получить любой из этих методов, чтобы работать? Или, возможно, другой метод?

Кроме того, 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 и изменить follwing строки

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 я затем перехожу к Project, Manage Kits, а затем в Qt Versions и просматриваю qMake, который я только что сгенерировал. Я добавляю новый комплект с этой версией qMake. Затем я очищаю все и переключаюсь на этот новый комплект и запускаю qmake из QtCreator. Затем я использую msvc2010 командную строку, чтобы перейти к каталогу, в котором файлы создаются, а затем

nmake release 

Это создает довольно большой EXE-файл, но как я уже сказал, это все-таки в зависимости от пары .dll-х годов.

+1

Запуск http://dependencywalker.com/ на вашем exe может объяснить, почему у вас есть зависимость dll. –

+0

Upvoted. Внедрение QT может стать проблемой. –

+1

Я не уверен, в чем проблема. Вы можете построить QtSerialPort статически, как любой проект на основе make. в чем именно проблема?: – lpapp

ответ

-1

Для статической связи внешней библиотеки у вас есть пара вариантов, у обоих есть свои плюсы и минусы.

I. Скомпилируйте библиотеку для статической связи. Ссылка на него.

  1. Ищите существующие переключатели конфигурации для статического соединения. В файле .pro/.pri может быть что-то вроде QTSERIALPORT_STATIC = no и т. Д. Просто скажите yes, чтобы библиотека собралась для статической ссылки и переходила к шагу 4!

  2. .pro/.pri файл заменить CONFIG += dllCONFIG += static.

  3. Удалить декларации экспорта из библиотеки. Обычно символы библиотеки Qt объявляются с некоторым определением, например QTSERIALPORT_EXPORT, который расширяется до Q_DECL_EXPORT/Q_DECL_IMPORT в использовании общей библиотеки/использует его заголовочные файлы при связывании. Вам нужно найти, где это QTSERIALPORT_EXPORT определяется и заменить его с пустым определением:

    #define QTSERIALPORT_EXPORT // in source file 
    

    или

    DEFINES += QTSERIALPORT_EXPORT # in .pro/.pri file 
    
  4. Построить библиотеку.

  5. Ссылка на библиотеку .lib/.a файл, используйте файлы заголовков библиотеки для деклараций символов в вашем проекте.

II. Включите исходные файлы библиотеки в свой проект и скомпилируйте их внутри него (без каких-либо ссылок).

  1. Включить все исходные файлы библиотеки в ваш проект (добавить в SOURCES в файле проекта QMAKE)

  2. Определить весь материал библиотеки зависит от (других библиотек, опции Qt и т.д.) и включите его также в свой файл .pro. ИЛИ Включите правильный .pri файл в .pro если автор библиотеки предоставляет его в-компиляции проекта

  3. Удалить декларации экспорта/импорта из исходной библиотеки кода (т.е. include(QtSerialPort.pri) или что-то.) - как описано в пункте 3 части I.

  4. Создайте свой проект.

+1

Вы говорите о том, как связывать статически, но у ОП была специальная проблема CONFIG + = static, как он упоминал.Я действительно не понимаю, как вы пытаетесь решить эту проблему. – lpapp

+1

Да, @LaszloPapp, я обращаюсь к этой же проблеме. OP хочет связать статически, но не знает, как это сделать. –

+1

Он уже упомянул, как. Проблема, с которой он столкнулся, это не сработало, и он не знал почему. FWIW, наша библиотека QtSerialPort много не тестировалась для статической компоновки, поэтому это может быть ошибкой в ​​нашем программном обеспечении. – lpapp

Смежные вопросы