- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
如果我构建一个 Qt/qmake 示例项目(在我的例子中是“analog clock”示例)并将其部署到运行 iOS 7.1 的设备上,一切都会很顺利:应用程序在设备上完美执行。 Chapeau - 来自 digia 的人们做了一项艰巨的工作,将 ios 工具链集成到他们的 Qt 工作流程中。
但是,如果我将 qmake 项目转换为 CMake 项目,事情就不会那么顺利了。我附上了 Qt-5.3.1 版本(见下文)中的模拟时钟示例,我在其中添加了一个 CMakeLists.txt 和一个运行 CMake 的脚本以生成适用于 iOS 的 XCode 项目。该项目编译甚至链接(我不得不添加一些额外的链接库,请参阅 CMake 源文件)。是的。
但这就是陷阱:应用程序在运行时崩溃并显示以下错误消息:
Error: Failed to load platform plugin “ios”
作为 this 中的评论线程状态必须通过项目设置“强制加载”libqios。这样做并没有太大改善情况,它只是将错误消息更改为:
Error: You are creating QApplication before calling UIApplicationMain.If you are writing a native iOS application, and only want to use Qt forparts of the application, a good place to create QApplication is from within'applicationDidFinishLaunching' inside your UIApplication delegate.
我有两个问题:
Here是包含我的 Qt-CMake 项目的 zip 文件的链接。我使用的 Qt 版本是 Qt-5.3.1 for iOS。
编辑:我发现如果将 qmake 示例从 Qt 示例文件夹结构中删除,它不会像这样工作。直接看Qt例子:path/to/Qt/examples/widgets/widgets/analogclock。
最佳答案
经过几个小时的探索,我找到了一种方法来为我的 iOS 版 Qt 应用程序创建 CMake 项目。我通过谷歌和检查 qmake 生成的输出得到的关键提示。我找到了真正发挥全部魔力的脚本,并将其部分应用到我的 CMake 源代码中。
这是对我有用的食谱。为了完整起见,我还添加了我在发布上述问题时已经知道的步骤:
将 CMake 引入 ios 工具链。请参阅我的示例项目的 cmake/toolchain/ios.toolchain.cmake。它设置了几个 CMake 属性并寻找必要的工具和框架。 (我不记得我从哪里得到那个文件了——但如果你用谷歌搜索它,它也被用于其他几个项目。)你必须将这个设置文件作为参数传递给 CMake(见下文)。
设置可执行文件的多个目标属性,将其转换为 (iOS) 应用程序包。应该清楚。请注意,有一个模板 Info.plist.in 将由 CMake 完成。
修复 1:在 CMake 中手动将缺失的库和框架链接到应用程序。出于某种原因,find_package(Qt5 ...)
不返回完整的依赖项列表。不过,我很可能在这里遗漏了一些东西。
修复 2:确保强制加载 libqios 以避免出现有关缺少 iOS 插件的错误消息。在 CMake 中:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -force_load ${YOUR_QT_ROOT_PATH}/plugins/platforms/libqios.a" )
修复 3:删除 Info.plist.in 中的 Storyboard 键。这一步我不是很了解。该方法的灵感来自 this在 stackoverflow 上发帖。
<key>UIMainStoryboardFile</key> <string>main</string>
修复 4:现在最重要的是:对于 iOS,您必须使用相应的“C”格式版本重命名 main() 函数。显然,Qt 自带了它自己的 main
入口点并将您编写的那个重命名为 qtmn()
.这个 qmake 魔术是由这个脚本执行的:your/qt/root/path/mkspecs/macx-ios-clang/rename_main.sh。我不详细了解这背后的完整机制。就我而言,我可以重命名 main 的函数签名:
// Replace... int main(int argc, char *argv[])
// ... with this line: extern "C" int qtmn(int argc, char *argv[])
Here再次是我在问题中提到的同一个项目,这次是从上面应用的修复程序。要构建此项目,只需调用 build_ios.sh
,然后打开在构建文件夹中创建的 xcodeproj 文件。
注意:工作假设是 XCode 的正确版本(在我的例子中是 5.1.1)可用并且您拥有有效的签名身份(在 CMakeLists.txt 中更改它!)。此外,在我的示例项目(见下文)中,我假设为 iOS 构建的 OpenCV 可用。我需要它来解决链接器问题:OpenCV 附带的 libpng 中缺少一些对象。
关于c++ - 通过 CMake 构建的 ios 上 Qt 应用程序的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25042916/
运行 pip install cmake 时出现上述错误在 alpine linux (WSL) 上。 完整错误: /home/user# pip install cmake Collecting c
我的项目依赖 mariadb-connector-c我正在尝试使用 cmake 自动化下载、构建和链接过程。 我目前将项目下载到一个目录中,然后尝试执行生成忍者文件并运行它们,但我根本无法运行 cma
我正在尝试像这样在 cmake 中执行 execute_process execute_process(COMMAND ${CMAKE_COMMAND} -P myScript.cmake 这仅在文件
我想知道如果我没有给它任何变量告诉它在哪里找到它,cmake 如何找到我的 llvm cmake 配置。 我是 LLVM 新手。我正在构建一个 Hello World LLVM pass。我在 Ubu
我正在开发一个使用 CMake 的项目。顶CMakeLists.txt文件包含以下行: cmake_minimum_required(VERSION 3.7.2) # Kittens will die
我正在使用 Meego 1.2 工具链使用 cmake 运行构建(长话短说)。这个特定的工具链需要使用 --sysroot 选项来查找它需要的任何库。 set (CMAKE_CXX_FLAGS "-f
我们有一些源代码处理工具,可以从多个“片段”生成原始汇编文件等内容。 当使用 make 中的这些工具时,我们可以通过让源处理工具发出“依赖文件”来确保最新的构建,就像 gcc 一样-MD 标志。 例如
如何在 MSYS2 中安装和配置“cmake”?我尝试安装以下 MSYS 包 我在运行任何 cmake 命令时都收到以下错误 '''CMakeLists.txt:5 (cmake_minimum_re
有没有办法在 CMake 中得到一个变量列表?具体来说,我想要做的是调用一个现有函数,该函数接受多个变量并检查它们的计算结果是否为 true。 在某些情况下,其中一些变量将是空列表(计算结果为 fal
我有两组测试(功能测试和单元测试),我希望能够指定通过 cmake 运行哪一组。 一组测试是我想通过“make test”运行的单元测试。 另一组测试是我想通过“制作功能测试”来运行的功能测试。 目前
我的目标是查看有关调用 g++ 的详细信息由 cmake 直接调用从命令行。我不关心 make 的输出就这个问题而言。 根据official FAQ和 the accepted answer on a
我有一个生成库的CMake项目。我已经编写了一个CMake脚本FindXXX.cmake来帮助我的图书馆的用户。这样,他们可以使用find_package(XXX)并获取所需的变量。到现在为止还挺好。
当我看到带有命名空间的 CMake 库时,它们总是在表单中Parent::Component . 如果我有一个足够大的库,那么该库的子部分可能包含组件。我想知道是否可以/适合做 ParentProje
CMake 变量和属性似乎完成了非常相似的事情,我一直无法理解它们之间的区别。 它们每个都有自己的文档部分,但两者都会影响构建系统,两者都是“预先存在的”,并且两者都可以基于其他 CMake 命令动态
我有一个包含多个子目录的 CMake 项目,例如: dir1 subdir11 subdir12 dir2 subdir21 subdir22 根 CMakeLists
如果您想将静态库链接到共享库或可执行文件,同时保持所有符号可见(例如,您可以稍后打开它以找到它们),在 Linux/BSD 上执行此操作的一种非可移植方式是使用标志-Wl,--whole-archiv
CMake 自动创建一个 FooTarget.cmake文件例如添加 install(EXPORT FooTargets FILE FooTargets.cmake NAMESPACE Foo
在CMake中,ELSE和ENDIF控制流函数将表达式作为参数。根据文档,这些是optional。那么这些目的是什么?仅仅是为了维护目的而使原始IF表达式更清晰,还是提供某些功能? 最佳答案 正如您所
我是 cmake 的新手,我发现它非常令人沮丧。我试图在构建运行时评估的文件路径中使用通配符,而不是在生成构建时。 我创建了一个构建,它使用 SWIG 为某些 C++ 代码生成 Java 包装器。我可
我可能在谷歌上搜索错误,但我无法找到 .cmake 文件的用途。 我刚刚偶然发现了一个我必须使用的项目的 CMake 工具,我很难理解它是如何工作的。我明白在包含 CMakeLists.txt 的目录
我是一名优秀的程序员,十分优秀!