2

Windows 7 で Necessitas 0.3 を使用して、クロスプラットフォームの Qt アプリケーションを Android に移植しようとしています (記録のために: Linux でもこれを試してみましたが、別の問題が発生しました)。アプリケーションは、いくつかの相互依存関係を持ついくつかの共有ライブラリと、その上にある小さなテスト実行可能ファイルで構成されています。

問題 #1: [これまでの進捗状況: 回避策あり]

オブジェクト ファイルは正常に生成されますが、オブジェクト ファイルへのパスにディレクトリ セパレータが 1 つないため、リンクが失敗します。

私のproファイルには次のものがあります(1つのファイルの例で、合計3つあります):

CONFIG(debug, debug|release):OBJECTS_DIR += debug

SOURCES += ../../common/common.cpp 

オブジェクトファイル「common.obj」が生成され、予想どおり「debug」サブディレクトリに正常に配置されます。次のエラーが表示されます。

arm-linux-androideabi-g++: error: debugcommon.obj: No such file or directory

オブジェクト ディレクトリの名前 (「debug」) とオブジェクト ファイル (「common.obj」) が連結されます -- それらの間のディレクトリ セパレータがありません。

生成された Makefile の関連部分:

OBJECTS_DIR   = debug\

OBJECTS       = debug\common.obj \

DESTDIR       = 

QtCreator は v2.3.1 (Qt 4.8.0 の 32 ビット バージョンに基づく) です。

これに対する回避策を見つけました -- デバッグ ディレクトリを使用しないでください:

# CONFIG(debug, debug|release):OBJECTS_DIR += debug

とにかく、すべてのビルドジャンクがソースからシャドウビルドディレクトリに分離されるため、シャドウビルドを使用する場合、これはそれほど問題ではありませんが、そもそもなぜこれが起こっているのか知りたい. Qtでこの問題が発生したことはありません。何か案は?

問題 #2: [これまでの進捗状況: クラッジがある]

Windows 上の Necessitas 0.3 alpha 4 は、完全に役に立たないところまで深刻に壊れているようです。私は新しい問題に数日間苦労しました: リンカは NDK ライブラリを見つけることができません。

Necessitas の 2 つのインストールを試しました。1 つは何も変更せず、すべてデフォルト値のままにし、2 つ目は新しい NDK を使用してすべてを手動で構成しようとしました。どちらも機能しません。

私が克服できなかった問題はリンカーにありました。NDK が見つからないだけで、常に「crtbegin_so.o」が見つからずに失敗します。この問題はデフォルトでNecessitasに付属するandroid-ndk-r6bにあることを示唆するstackoverflowに関するいくつかの回答がありますが、前述のように、Necessitasを後のNDKに向けようとしたときはさらに運が悪かったです(私はr8bを試しました- - ビルドは、STL ヘッダー ファイルが見つからないという不平を言って非常に早い段階で失敗し、その解決策は見つかりませんでした)。

「crtbegin_so.o」、「crtend_android.o」、および「crtend_so.o」をビルドディレクトリにコピーするだけでこの問題を回避しようとしましたが、それ以上のことはできません-今回はQtGuiでリンカーが再び失敗します. 「gui」ではなく「core」と「xml」のみを使用する共有ライブラリを構築しようとしているので、これはさらに謎です。qmake変数QTにはデフォルトで「core」と「gui」が含まれていることは知っていますが、TEMPLATEが「lib」に設定されている場合、これは当てはまらないと思いましたか? 「mkspecs/android-g++/qmake.conf」と「qws.conf」の両方から「gui」を削除し(見つけることができたのは2つの場所だけです)、念のためにすべてのproファイルを注意深くチェックしましたが、まだです「ld.exe: -lQtGui が見つかりません」というメッセージが表示されます。

「\Necessitas\Android\Qt\480\armeabi\lib」の内容を確認したところ、間違ったパス (開発者のマシンから残ったものですか?) でいっぱいの多くの prl および pc ファイルを含め、すべてがそこにあります。それらを削除すると、 lnk.cmdline ファイルを生成しましたが、それでも解決しません。Windows Necessitas は、バックスラッシュを含む標準の Windows パスを処理できない可能性があると思われます。「不足している」QtGui は「\Necessitas\Android\Qt\480\armeabi\lib」にあり、最初のモジュールの lnk.cmdfile には「-LC」が含まれています。 :\Necessitas\Android\Qt\480\armeabi\lib". したがって、それを見つける必要がありますが、そうではありません。lnk.cmdline 内の他のすべてのパスには、ディレクトリ セパレータとしてスラッシュが含まれています。どこでも検索しました (QtCreator のビルド環境などの場所を含む) が、'

問題 #3: [これまでの進捗状況: クラッジがある]

コンパイル出力でこのビットを見つけました:

C:/Necessitas/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-g++ @my_lib.so.1.0.0.lnk.cmdline
del /q 2> NUL my_lib.so.1.0.0.lnk.cmdline
ln -s my_lib.so.1.0.0 my_lib.so
ln -s my_lib.so.1.0.0 my_lib.so.1
ln -s my_lib.so.1.0.0 my_lib.so.1.0

もちろん、「ln -s」は失敗します。これは Windows でビルドしているためです。これがどこから来ているのか、「mklink」に変更する方法がわかりません。「QMAKE_SYMBOLIC_LINK = ln –s」が見つかった唯一の場所は「\Necessitas\Android\Qt\480\armeabi\mkspecs\unsupported\win32-g++-cross\qmake.conf」ですが、そうではありません:このconfファイルは意図されていますMinGWの場合(とにかく変更しようとしました-何もありません)。「QMAKE_SYMBOLIC_LINK = copy /y」のようなものを追加すると、生成された Makefile で、SYMLINK が「ln -s」から「copy /y」に変更されていることがわかりますが、これは無視されます。lnk.cmdline は引き続き「ln」で生成されます。 -s" を "copy /y" の代わりに使用します。

幸いなことに、少なくともこの失敗は致命的ではなく、ビルドを続行できます。QtのQMAKE_PRE_LINKを介してファイルコピーを設定するだけで、これを回避しました。

QMAKE_POST_LINK += $${QMAKE_COPY} my_lib.so.1.0.0 ..\\my_lib.so $$escape_expand(\n\t)
QMAKE_POST_LINK += $${QMAKE_COPY} my_lib.so.1.0.0 ..\\my_lib.so.1 $$escape_expand(\n\t)
QMAKE_POST_LINK += $${QMAKE_COPY} my_lib.so.1.0.0 ..\\my_lib.so.1.0 $$escape_expand(\n\t)

問題#4:[これまでの進捗状況:解決済み]

これは実際にはコンパイルの問題であり、変更が必要です。最初の 3 つの問題の回避策を適用した後、いくつかの共有ライブラリをビルドしましたが、その後、quint64 を使用するライブラリのコンパイルを開始しました。このエラーが発生しました:

In file included from C:\Necessitas\android-ndk-r6b\platforms\android-9\arch-arm\usr\include/strings.h:42,
             from C:\Necessitas\android-ndk-r6b\platforms\android-9\arch-arm\usr\include/stdlib.h:42,
             from C:\Necessitas\android-ndk-r6b\sources\cxx-stl\gnu-libstdc++\include/cstdlib:68,
             from C:\Necessitas\android-ndk-r6b\sources\cxx-stl\gnu-libstdc++\include/bits/stl_algo.h:60,
             from C:\Necessitas\android-ndk-r6b\sources\cxx-stl\gnu-libstdc++\include/algorithm:62,
             from C:\Necessitas\Android\Qt\480\armeabi\include\QtCore/qglobal.h:68,
             from ..\..\..\DurianQtAndroid\jni\common\include/crossplatformstringapi.h:15,
             from ..\..\..\DurianQtAndroid\jni\common\include/common.h:18,
             from ..\..\..\DurianQtAndroid\jni\common\common.cpp:9:
C:\Necessitas\android-ndk-r6b\platforms\android-9\arch-arm\usr\include/sys/types.h:124: error: 'uint64_t' does not name a type

これは簡単な修正でした.proファイルの「android:QMAKE_CXXFLAGS += -std=c++0x」を「android:QMAKE_CXXFLAGS += -std=gnu++0x」に置き換えるだけでした-Windowsの問題ではありませんまったく!

問題 5: [これまでの進捗状況: なし]

もう 1 つの Windows 以外の問題: 'wstring' がサポートされていません。カスタムのクリスタックス NDK をダウンロードして (android-ndk-r7-crystax-5.beta2-windows.zip) 試してみますが、Necessitas でうまく動作するという期待はあまりありません...

4

0 に答える 0