0

我希望用户能够将我使用 Qt 的应用程序重新链接到他们自己的 Qt 版本,而不必被迫重建所有源代码。例如,这可以用于 LGPL 合规性。为此,我需要为所有源提供目标文件。为了方便起见,我使用 qmake 将项目内部划分为:

  1. 一个静态库项目,其中包含所有源文件的对象,包括具有int main(int, char**).

  2. 将上面的静态库与 Qt 链接的应用程序项目。Qt 可以是静态库或动态库。该项目没有源文件。

然后我分发静态库 (.lib) 和应用程序项目文件,以便任何人都可以使用他们自己的 Qt 版本重新链接应用程序,以他们喜欢的任何方式(静态链接 Qt 或动态链接 Qt),只要他们有MSVC 的必要版本。

我正在 MSVC 2008 (Qt 4) 和 2012 (Qt 5) 下进行构建。makefile 由 qmake 生成。

问题是在构建应用程序项目时链接失败。

LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup

只要我将一个虚拟源文件添加dummy.cpp应用程序项目中,链接就会成功。有没有办法避免这种解决方法?

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

1 回答 1

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
于 2013-09-09T18:48:15.723 回答