#c #macos #cmake #objective-c
Вопрос:
У меня есть проект на C , который использует CMake в качестве системы сборки. При переносе его на macOS мне нужно было интегрировать пару файлов Objective-C , но, к сожалению, все, что я получаю, — это ошибки сборки. Также не помогает то, что я далек от эксперта по Objective-C .
Чтобы оказаться там, где я сейчас нахожусь, я начал с обновления project
определения проекта pure C , включив в него как C , так и Objective-C :
project(projectFOO LANGUAGES CXX OBJCXX)
После этого я передал все исходные файлы Objective-C «. mm » и их заголовки прямо в вызовы add_library
.
Однако, когда я перестраиваю проект cmake, в результате я получаю стену ошибок компилятора с несколькими сообщениями об ошибках, которые выглядят следующим образом:
(...) In file included from /Users/ram/development/Foo/source/MyNSImage.mm:1: /Users/ram/development/Foo/include/MyNSImage.h:22:5: error: unknown type name 'CGContextRef' (...) /Users/ram/development/Foo/source/MyNSImage.mm:7:81: error: use of undeclared identifier 'nil' (...)
После просмотра команд компилятора, выполняемых сборкой, я заметил, что она вызывает /usr/bin/c
при передаче обоих -x objective-c -g
и -std=gnu 11
.
Впоследствии я мог бы воспроизвести ту же ошибку, создав библиотеку, включающую только файлы Objective-C , определение CMake которой выглядит следующим образом:
cmake_minimum_required(VERSION 3.16) # Introduces support for OBJC and OBJCXX. See https://cmake.org/cmake/help/v3.16/release/3.16.html project(projectFOO LANGUAGES CXX OBJCXX) # (..omit C code..) if(APPLE) # separate library created just to build the Objective-C code add_library(foo_mac include/MyNSImage.h source/MyNSImage.mm ) target_include_directories(foo_mac PUBLIC include ) endif() # (..omit more C code..) # here's the C library add_library(foo ${foo_INCLUDES} ${foo_HEADERS} ) if(APPLE) # when building on macOS, also link the Objective-C lib. target_link_libraries(foo foo_mac) endif()
После обновления проекта CMake -DCMAKE_VERBOSE_MAKEFILE
и его перестройки вот команда компилятора для foo_mac
:
(...) cd /Users/ram/development/Foo/cmake-build-debug/Foo amp;amp; /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c -I/Users/ram/development/Foo/include -x objective-c -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -fPIC -std=gnu 11 -o CMakeFiles/foo_mac.dir/source/MyNSImage.mm.o -c /Users/ram/development/Foo/source/MyNSImage.mm (...)
У кого-нибудь есть какие-либо идеи о том, что я могу делать неправильно?
Комментарии:
1. Не могли бы вы, пожалуйста, обновить сообщение с полным вызовом компилятора (через make VERBOSE=1) ? Похоже, вам не хватает некоторых элементов.
2. @NickolayOlshevsky, конечно. Очевидно, звонит cmake
$(snip long path)/XcodeDefault.xctoolchain/usr/bin/c
. Я продолжу обновлять вопрос с помощью минимального рабочего примера.
Ответ №1:
Оказалось, что основной причиной было отсутствие #import
, которое в исходном модуле Objective-C было скрыто с предварительно скомпилированным заголовком, переданным глобально с -include=${header}
определением компилятора.