Neccesitas在Windows上构建问题

时间:2012-08-07 06:21:37

标签: windows-7 qt4 android-ndk qmake

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

问题#1:[进展如此:有办法]

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

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

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安装 - 一次我没有修改任何东西,保留所有默认值,第二次我试图使用更新的NDK并手动配置所有内容。两者都不起作用。

我无法克服的问题是链接器。它无法找到NDK,总是因为无法找到" crtbegin_so.o"而失败。 stackoverflow上有一些答案表明这个问题与android-ndk-r6b一起默认使用Necessitas,但如前所述,当我试图将Necessitas指向后来的NDK时,我的运气更少(我试过r8b - - 在抱怨缺少STL头文件时,构建很早就失败了,没有找到解决办法。

我试图通过复制" crtbegin_so.o"," crtend_android.o"来解决这个问题。和" crtend_so.o"到我的构建目录,但这并没有让我更进一步 - 链接器再次失败,这次是在QtGui上。这个更加神秘,因为我试图构建一个只使用'核心的共享库。和' xml'而不是' gui'。我知道qmake变量QT默认包含'核心'并且' gui',但我认为当TEMPLATE设置为' lib'?时不适用我删除了#gui'来自" mkspecs / android-g ++ / qmake.conf"和" qws.conf" (我能找到它的唯一两个地方),也仔细检查了我的所有专业文件以防万一,但仍然提出了" ld.exe:找不到-lQtGui"信息。我还尝试了两个版本的项目" libs.xml" - 一个QtGui添加到qt-libs,另一个没有它。

我检查了" \ 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中的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_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"到"复制/ y"但是这被忽略了 - 还是用" ln -s"生成了lnk.cmdline。而不是" copy / y"。

幸运的是,至少这种失败不是致命的,而且可以继续构建。我通过Qt&#39的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

这个是一个简单的修复,只需要替换" android:QMAKE_CXXFLAGS + = -std = c ++ 0x"在我的pro文件中使用" android:QMAKE_CXXFLAGS + = -std = gnu ++ 0x" - 根本不是Windows问题!

问题#5:[进展如此:没有]

另一个非Windows问题:不支持'wstring'。下载自定义crystax NDK尝试(android-ndk-r7-crystax-5.beta2-windows.zip),但并不是真的希望它能与Necessitas一起发挥... ...

0 个答案:

没有答案