Включите исходные файлы objective-c в проект c

#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} определением компилятора.