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 に答える