2

我正在尝试在 Windows 7 上使用 Necessitas 0.3 将跨平台 Qt 应用程序移植到 Android(记录在案:我也在 Linux 上尝试过,但遇到了一组不同的问题)。应用程序由几个具有一些相互依赖关系的共享库和一个小的测试可执行文件组成。

问题 1:[到目前为止的进展:有变通方法]

目标文件生成良好,但链接失败,因为目标文件的路径缺少一个目录分隔符。

我的专业文件中有以下内容(一个文件的示例,我总共有三个):

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:[到目前为止的进展:有 KLUDGE]

Windows 上的 Necessitas 0.3 alpha 4 似乎被严重破坏,到了完全没用的地步。我花了几天的时间来解决这个新问题:链接器无法找到 NDK 库。

我尝试了两次 Necessitas 安装——一次我没有修改任何内容,保留所有默认值,第二次我尝试使用较新的 NDK 并手动配置所有内容。两者都不起作用。

我无法克服的问题是链接器。它只是找不到NDK,总是因为找不到“crtbegin_so.o”而失败。stackoverflow 上有一些答案表明这个问题与 android-ndk-r6b 相关,它是 Necessitas 默认提供的,但如前所述,当我尝试将 Necessitas 指向后来的 NDK 时,我的运气更差(我试过 r8b - - 由于抱怨缺少 STL 头文件,构建很早就失败了,没有找到解决方案)。

我试图通过将“crtbegin_so.o”、“crtend_android.o”和“crtend_so.o”复制到我的构建目录来解决这个问题,但这并没有让我更进一步——链接器再次失败,这次是在 QtGui . 这个更加神秘,因为我正在尝试构建一个仅使用“core”和“xml”而不是“gui”的共享库。我知道qmake变量QT默认包含'core'和'gui',但我认为当TEMPLATE设置为'lib'时这不适用?我从“mkspecs/android-g++/qmake.conf”和“qws.conf”(我能找到它的唯一两个地方)中删除了“gui”,还仔细检查了我所有的 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.cmd 文件包含“-LC :\Necessitas\Android\Qt\480\armeabi\lib"。所以它应该找到它,但它不是。lnk.cmdline 中的所有其他路径都使用正斜杠作为目录分隔符。我到处搜索(包括像 QtCreator 中的构建环境这样的地方)但没有

问题 3:[到目前为止的进展:有 KLUDGE]

我在编译输出中发现了这一点:

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”而不是“复制/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:[到目前为止的进展:已解决]

这实际上是一个编译问题,进行更改。在为前三个问题应用解决方法后,我构建了一些共享库,但随后它开始编译使用 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:[到目前为止的进展:无]

另一个非 Windows 问题:不支持“wstring”。下载自定义 crystax NDK 以尝试 (android-ndk-r7-crystax-5.beta2-windows.zip) 但并不希望它能与 Necessitas 很好地配合...

4

0 回答 0