【问题标题】:CMakeLists.txt for an Objective C ProjectObjective C 项目的 CMakeLists.txt
【发布时间】:2014-01-07 02:23:56
【问题描述】:

我正在使用 Objective-C 和 CMake 在 OSX 上简单地创建一个 hello world 可执行文件。我都是新手,所以我会很感激任何建议。我了解 CMake 本身并不支持构建 Objective-C。您必须先添加

set(CMAKE_C_FLAGS "-x objective-c")

set(CMAKE_CXX_FLAGS "-x objective-c++")

甚至可以创建 Makefile。我陷入困境的部分是如何适当地链接现有框架。我已经按照这篇文章中的说明以及它所基于的教程进行操作:Can't link MacOS frameworks with CMake 我还尝试将库与:

set(CMAKE_EXE_LINKER_FLAGS "-framework fm1-framework fm2…")

我现在可以获得一个成功的 CMake 生成的 Xcode 项目,但是当我打开该项目时,我在 CMakeLists.txt 文件中指定的所有框架都不在“resources”文件夹中。使用这个 Xcode 项目,我可以编译项目,但是当我运行可执行文件时,我得到了错误:

"2014-01-06 18:02:35.859 HelloWorld[62641:303] 应用程序包中没有 Info.plist 文件或 Info.plist 文件中没有 NSPrincipalClass,退出 程序以退出代码结束:1"

我还尝试在终端中手动运行由 CMake 制作的 makefile,并收到很多警告(在链接期间)都说:

CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:2252:警告:空字符 忽略 [-Wnull-character] ...

CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:2263:警告:空字符 忽略 [-Wnull-character] ...

还有 7 个错误(链接期间):

CMakeFiles/HelloWorld.dir/AppDelegate.m.o:1:1:错误:预期的不合格 ID

CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:90:错误:预期的不合格 ID ...HuHU]fffff.

CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:121:错误:多余的右括号 ('}') ...}HuHuH=

CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:122:错误:预期的不合格 ID ...HuHuH=

CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:169:错误:多余的右括号 ('}') ...}HuHUHuH=

CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:170:错误:预期的不合格 ID ...HuHUHuH=

CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:2246:错误:预期的不合格 ID ...16@0:8

对我的错误有什么想法吗?我花了一天的大部分时间寻找答案,我引用的帖子有最有用的信息,但它仍然没有解决我的问题。是不是因为原来的程序也是用Xcode写的?不知何故,这搞砸了 CMake?

这是我的 HelloWorld 应用程序的代码:

#import <Cocoa/Cocoa.h>

int main(int argc, const char * argv[])
{
    return NSApplicationMain(argc, argv);
}

以及 CMakeLists.txt 文件的代码:

cmake_minimum_required(VERSION 2.8)
project(HelloWorld)

set(src_files
   AppDelegate.h
   AppDelegate.m
   main.m
)

set(CMAKE_C_FLAGS "-x objective-c")
set(CMAKE_CXX_FLAGS "-x objective-c++")
set(CMAKE_EXE_LINKER_FLAGS "-framework Cocoa -framework AppKit -framework CoreData -     framework Foundation")

add_executable(HelloWorld 
   ${src_files}
)

提前致谢!

【问题讨论】:

  • 无需修改 CMAKE_CXX_FLAGS 即可正常工作。如果删除-x objective-c++ 会怎样?
  • 如果我删除 -x objective-c++ 仍然得到相同的结果
  • 但我确实认为我已经取得了一些进展,看来问题在于链接 Cocoa 框架。如果我只打开一个常规的目标 c Xcode 项目作为命令行可执行文件而不是 Cocoa 项目,我可以让 CMake 正常工作。如果这可能特定于 CMake 2.8-11 或 Xcode 5.0.2 版本,有什么想法吗?
  • If I open just a regular objective c Xcode project as a command line executable instead of a Cocoa project, I can get CMake to work just fine 我不明白你的意思...
  • 看看这个项目:github.com/forexample/cocoa-app

标签: objective-c xcode cmake


【解决方案1】:

间接感谢 ruslo 和位于此处的源代码:https://github.com/forexample/cocoa-app 我找到了问题所在。 CMake 似乎可以使用 Xcode 生成的 plist,必须使用上述 repo 中 README.md 中指定的命令行指令。 CMake 的 GUI 实现将工作,因为 GUI 无法解释 plist 文件。为清楚起见,我将在此处列出它们:

cd 到包含 CMakeLists.txt 文件的目录。

cmake -H. -B_OutputDirectory -GXcode

cmake --build _OutputDirectory/

打开_OutputDirectory/HelloWorld.xcodeproj/

我遇到的另一个问题是我的 plist 和 MainWindow.xib 未包含在我的原始 CMake 文件中。添加 MainWindow.xib 和 HelloWorld-info.plist 必要代码后,我能够生成一个可用的 Xcode 项目。参考代码如下:

cmake_minimum_required(VERSION 2.8)
project(HelloWorld)
set(NAME HelloWorld) 
set(CMAKE_C_FLAGS "-x objective-c")

set(HEADER_FILES 
    ./uhdplayerengine/HelloWorld/HelloWorld/AppDelegate.h
)
set(SOURCE_FILES 
    ./uhdplayerengine/HelloWorld/HelloWorld/AppDelegate.m
    ./uhdplayerengine/HelloWorld/HelloWorld/main.m
)
set(XIB_FILE
    ./uhdplayerengine/HelloWorld/HelloWorld/Base.lproj/MainMenu.xib
)

add_executable(
    ${NAME}
    MACOSX_BUNDLE
    ${HEADER_FILES}
    ${SOURCE_FILES}
    ${XIB_FILE}
)

set_source_files_properties(
    ${XIB_FILE}
    PROPERTIES
    MACOSX_PACKAGE_LOCATION
    Resources
)

set_target_properties(
    ${NAME}
    PROPERTIES
    MACOSX_BUNDLE_INFO_PLIST
    ./uhdplayerengine/HelloWorld/HelloWorld/HelloWorld-Info.plist
)

target_link_libraries(${NAME}
    "-framework Cocoa"
    "-framework AppKit"
    "-framework CoreData"
    "-framework Foundation"
)

我希望这可以避免其他人头疼!谢谢鲁斯洛!

【讨论】:

  • NOT work because the GUI has trouble interpreting the plist file什么麻烦?我尝试通过cmake-gui 创建项目并收到一些位置错误消息。我将使用绝对路径修复它。将更改拉入您的存储库并进行测试。
  • 正如我之前提到的,没有必要添加这个标志set(CMAKE_C_FLAGS "-x objective-c")。顺便说一句,这个变量可能不是空的,所以如果你想添加一些你需要使用命令的标志:set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -x objective-c")
  • 感谢您对片场的澄清(CMAKE_C_FLAGS)。是的,位置错误就是我所说的。看起来您对路径所做的更改确实修复了它!再次感谢您的帮助。
【解决方案2】:

其实cmake从3.16开始同时支持objcobjc++(查看release notes

您可以使用CMAKE_OBJCXX_FLAGSCMAKE_OBJC_FLAGS 指定特定标志。

别忘了打电话给enable_language(OBJC)enable_language(OBJCXX)

附:这里是相关公关https://gitlab.kitware.com/cmake/cmake/-/merge_requests/3811

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多