我正在使用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}
)
提前致谢!
答案 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 开始同时支持 cmake
和 objc
(检查 release notes)
您可以使用 objc++
和 CMAKE_OBJCXX_FLAGS
来指定特定标志。
另外不要忘记调用 CMAKE_OBJC_FLAGS
或 enable_language(OBJC)
附言这是相关的 PR https://gitlab.kitware.com/cmake/cmake/-/merge_requests/3811