Линкер не использует библиотеку времени выполнения по умолчанию при связывании только библиотек (без объектов)

Я хочу, чтобы пользователи могли повторно связать мое приложение, использующее Qt, со своей собственной сборкой Qt, без необходимости перестраивать все исходные коды. Это можно использовать, например, для соответствия LGPL. Для этого мне нужно предоставить объектные файлы для всех моих источников. Чтобы сделать это проще, используя qmake, я разделил проект на:

  1. Проект статической библиотеки, содержащий объекты для всех исходных файлов, включая файл с int main(int, char**),

  2. Проект приложения, который связывает статическую библиотеку выше с Qt. Qt может быть статической библиотекой или динамической. Для этого проекта нет исходных файлов.

Затем я распространяю статическую библиотеку (.lib) и файл проекта приложения, чтобы любой мог связать приложение со своей собственной версией Qt, в зависимости от того, какой способ он предпочитает (статически связанный Qt или динамически связанный Qt), при условии, что он имеет необходимая версия MSVC.

Я делаю сборку под MSVC 2008 (Qt 4) и 2012 (Qt 5). Makefiles генерируются qmake.

Проблема в том, что при сборке проекта приложения происходит сбой связывания.

LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup

Как только я добавлю фиктивный исходный файл dummy.cpp к проекту приложения, связывание успешно. Есть ли способ избежать этого обходного пути?

//dummy.cpp (this is the entire source)
int dummy;

1 ответ

Решение

Оказывается, что компоновщик не достаточно умен, чтобы выяснить, какая библиотека времени выполнения по умолчанию необходима для исполняемого файла, если для связывания даются только статические библиотеки без дискретных объектных файлов. Это можно подтвердить, запросив многословный компоновщик в файле.pro:

win32-msvc*: QMAKE_LFLAGS += /VERBOSE /VERBOSE:LIB /VERBOSE:REF

Когда фиктивный файл присутствует в проекте приложения, компоновщик перечисляет следующие библиотеки по умолчанию:

Processed /DEFAULTLIB:msvcprt
Processed /DEFAULTLIB:MSVCRT
Processed /DEFAULTLIB:OLDNAMES
Processed /DEFAULTLIB:uuid.lib

Без файла-заглушки компоновщик не выбирает библиотеки по умолчанию. Затем он не может найти точку входа, поскольку среда выполнения C не связана с.

Добавление соответствующей библиотеки времени выполнения C достаточно, чтобы связать приложение. В файле проекта приложения добавляется:

win32-msvc*:CONFIG(release, debug|release): QMAKE_LFLAGS += /DEFAULTLIB:msvcrt
win32-msvc*:CONFIG(debug, debug|release): QMAKE_LFLAGS += /DEFAULTLIB:msvcrtd
Другие вопросы по тегам