Objective C项目的CMakeLists.txt

时间:2014-01-07 02:23:57

标签: objective-c xcode cmake

我正在使用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:警告:null字符        忽略[-Wnull-character]    ...

     

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

7个错误(在链接期间):

  

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

     

CMakeFiles / HelloWorld.dir / AppDelegate.m.o:3:90:错误:预期的不合格ID    ... H< 89> uH容< 89> U,C]&FFFFF LT; 84>

     

CMakeFiles / HelloWorld.dir / AppDelegate.m.o:3:121:错误:无关闭括号        ( '}')    ...} H< 89> uH容< 8B> uH容< 8B> =

     

CMakeFiles / HelloWorld.dir / AppDelegate.m.o:3:122:错误:预期的不合格ID    ... H< 89> uH容< 8B> uH容< 8B> =

     

CMakeFiles / HelloWorld.dir / AppDelegate.m.o:3:169:错误:无关闭括号        ( '}')    ...} H< 89> uH容< 89> UH< 8B> uH容< 8B> =

     

CMakeFiles / HelloWorld.dir / AppDelegate.m.o:3:170:错误:预期的不合格ID    ... H< 89> uH容< 89> UH< 8B> uH容< 8B> =

     

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}
)

提前致谢!

2 个答案:

答案 0 :(得分:1)

间接感谢ruslo和位于此处的源代码:https://github.com/forexample/cocoa-app我发现了问题所在。看起来CMake使用Xcode生成的plist,一个必须使用上面提到的repo中README.md中指定的命令行指令。 CMake的GUI实现将 NOT 工作,因为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"
)

我希望这可以让别人头疼!谢谢ruslo!

答案 1 :(得分:1)

实际上 Map 从 3.16 开始同时支持 cmakeobjc(检查 release notes

您可以使用 objc++CMAKE_OBJCXX_FLAGS 来指定特定标志。

另外不要忘记调用 CMAKE_OBJC_FLAGSenable_language(OBJC)

附言这是相关的 PR https://gitlab.kitware.com/cmake/cmake/-/merge_requests/3811