xcode Objective-C项目的CMakeLists.txt文件

1qczuiv0  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(259)

我正在使用Objective-C和CMake在macOS上创建一个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/您好世界.目录/应用程序代表.操作方式:3:2252:警告:空字符
已忽略[-空字符]
...
CMakeFiles/您好世界.目录/应用程序代表.操作方式:3:2263:警告:空字符
已忽略[-空字符]
...
和7个错误(链接期间):
目录/应用程序代理. m. o:1:1:错误:需要未限定的ID〈U +0007〉
CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:90: error: expected unqualified-id ...H<89>uH<89>U]fffff.<U+000F><U+001F><84>
CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:121: error: extraneous closing brace ('}') ...}H<89>uH<8B>uH<8B>=
CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:122: error: expected unqualified-id ...H<89>uH<8B>uH<8B>=
CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:169: error: extraneous closing brace ('}') ...}H<89>uH<89>UH<8B>uH<8B>=
CMakeFiles/HelloWorld.dir/AppDelegate.m.o:3:170: error: expected unqualified-id ...H<89>uH<89>UH<8B>uH<8B>=
CMakeFiles/您好世界.目录/应用程序代表.操作方式: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}
)
62lalag4

62lalag41#

间接感谢ruslo和源代码位于:https://github.com/forexample/cocoa-app我发现了这个问题。看起来CMake要使用Xcode生成的plist,必须使用上面提到的repo中www.example.com指定的命令行指令README.md。CMake的GUI实现不能工作,因为GUI在解释plist文件时有问题。为了清楚起见,我将在这里列出它们:
cd到包含CMakeLists.txt文件的目录。
cmake -H. -B_输出目录-GX代码
cmake --生成输出目录/
打开输出目录/您好世界.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"
)

我希望这能让其他人免于头疼!谢谢ruslo!

ugmeyewa

ugmeyewa2#

实际上,cmake从3.16开始支持objcobjc++(检查release notes
可以使用CMAKE_OBJCXX_FLAGSCMAKE_OBJC_FLAGS指定特定标志。
另外,不要忘记调用enable_language(OBJC)enable_language(OBJCXX)
P.S.此处为相关PR https://gitlab.kitware.com/cmake/cmake/-/merge_requests/3811

相关问题