Windows 7 Windows上的Neccesitas生成问题

Windows 7 Windows上的Neccesitas生成问题,windows-7,qt4,android-ndk,qmake,Windows 7,Qt4,Android Ndk,Qmake,我正试图在Windows7上使用Essentials0.3将跨平台的Qt应用程序移植到Android上(作为记录:我在Linux上也尝试过,只是遇到了一系列不同的问题)。应用程序由几个具有一些相互依赖关系的共享库和顶部的一个小测试可执行文件组成 问题#1:[迄今为止的进展:有解决办法] 对象文件生成良好,但链接失败,因为对象文件的路径缺少一个目录分隔符 我的pro文件中包含以下内容(例如,对于一个文件,我总共有三个): 对象文件“common.obj”被生成,并按预期在“debug”子目录fin

我正试图在Windows7上使用Essentials0.3将跨平台的Qt应用程序移植到Android上(作为记录:我在Linux上也尝试过,只是遇到了一系列不同的问题)。应用程序由几个具有一些相互依赖关系的共享库和顶部的一个小测试可执行文件组成

问题#1:[迄今为止的进展:有解决办法]

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

我的pro文件中包含以下内容(例如,对于一个文件,我总共有三个):

对象文件“common.obj”被生成,并按预期在“debug”子目录fine中结束。现在我得到以下错误:

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(基于32位版本的Qt 4.8.0)

我找到了一个解决方法--不要使用调试目录:

# CONFIG(debug, debug|release):OBJECTS_DIR += debug
当使用影子构建时,这不是什么大问题,因为所有构建垃圾都会从源代码分离到影子构建目录中,但我还是想知道为什么会发生这种情况。我以前从未遇到过Qt的这个问题。有什么想法吗

问题2:[迄今为止的进展:有困难]

窗户上的Essentials 0.3 alpha 4似乎严重损坏,完全没有用处。我花了好几天时间来解决这个新问题:linker无法找到NDK库

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

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

我试图通过将“crtbegin_so.o”、“crtend_android.o”和“crtend_so.o”复制到我的构建目录来解决这个问题,但这并没有让我走得更远——链接器再次失败,这次是在QtGui上。这一个更加神秘,因为我正在尝试构建一个只使用“核心”和“xml”,而不使用“gui”的共享库。我知道qmake变量QT默认包含'core'和'gui',但我认为当模板设置为'lib'时这不适用?我从“mkspecs/android-g++/qmake.conf”和“qws.conf”(我唯一能找到它的两个地方)中删除了“gui”,还仔细检查了我所有的pro文件以防万一,但仍然出现了“ld.exe:cannot find-lQtGui”消息。我还尝试了两个版本的project的“libs.xml”——一个版本将QtGui添加到qt libs中,另一个版本没有

我检查了“\employmentas\Android\Qt\480\armeabi\lib”的内容,所有内容都在里面,包括大量充满错误路径的prl和pc文件(从开发人员的机器上遗留下来的?)——删除这些路径会使它们从生成的lnk.cmdline文件中消失,但这仍然没有帮助。我怀疑Windows Essentials可能无法处理包含反斜杠的标准Windows路径--“缺少”QtGui位于“\Essentials\Android\Qt\480\armeabi\lib”中,并且第一个模块的lnk.cmdfile包含“-LC:\Essentials\Android\Qt\480\armeabi\lib”。所以它应该找到它,但它不是。lnk.cmdline中的所有其他路径都使用前斜杠作为目录分隔符。我到处搜索(包括QtCreator中的Build Environment),但还没有找到这条路径的来源以及如何更改它

问题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\u SYMBOLIC\u LINK=ln–s”的唯一地方是“\empidentials\Android\Qt\480\armeabi\mkspecs\unsupported\win32-g++-cross\QMAKE.conf”,但事实并非如此:这个conf文件是为MinGW准备的(无论如何都尝试过更改它——什么都没有)。如果我添加类似“QMAKE\u SYMBOLIC\u LINK=copy/y”的内容,那么在生成的Makefile中,我可以看到符号链接从“ln-s”更改为“copy/y”,但这被忽略了——lnk.cmdline仍然使用“ln-s”而不是“copy/y”生成

幸运的是,至少这次失败不是致命的,构建可以继续。我通过Qt的QMAKE_PRE_链接设置文件副本来解决这个问题:

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_cxflags+=-std=gnu++0x”——这根本不是Windows的问题

问题5:[迄今为止的进展:无]


另一个非Windows问题:不支持“wstring”。下载定制的crystax NDK进行尝试(android-NDK-r7-crystax-5.beta2 windows.zip),但并不希望它能很好地与Essentials配合使用……

这不是一个练习,这只是自我惩罚,linux是为android开发的合适生态系统,如果您不想为GNU/linux发行版专门分配一个额外的分区,只需创建一个VirtualMachine。巨大的失望,也带来了巨大的混乱。首先,大多数文件权限只是一团乱麻,没有韵律或理由--
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