Incluya archivos de código fuente Objective-C++ en un proyecto de C++.
Tengo un proyecto de C ++ que utiliza CMake como su sistema de compilación. Al portarlo a macOS, necesitaba integrar un par de archivos ObjC ++, pero desafortunadamente todo lo que obtengo son errores de compilación. También no ayuda que no sea experto en ObjC ++.
Para llegar al punto en el que estoy ahora, comencé actualizando la definición del proyecto de C ++ puro para incluir tanto C ++ como ObjC ++:
proyecto (proyectoFOO LENGUAJES CXX OBJCXX)
Después, pasé todos los archivos fuente “.mm” de ObjC ++ y sus encabezados directamente en llamadas a add_library
.
Sin embargo, cuando reconstruyo el proyecto CMake, obtengo como resultado una pared de errores de compilación con pocos mensajes de error que se ven así:
(...)
En archivo incluido desde /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'
(...)
Después de revisar los comandos del compilador ejecutados por la compilación, noté que está llamando a /usr/bin/c++
mientras pasa tanto -x objective-c++ -g
como -std=gnu++11
.
Después pude reproducir el mismo error creando una biblioteca que solo incluye los archivos ObjC ++, cuya definición de CMake es algo así:
cmake_minimum_required (VERSION 3.16) # Introduce soporte para OBJC y OBJCXX. Consulte https://cmake.org/cmake/help/v3.16/release/3.16.html
proyecto (proyectoFOO LENGUAJES CXX OBJCXX)
(aquí omito código en C ++)
si (APPLE)
# biblioteca separada creada solo para compilar el código ObjC ++
add_library (foo_mac
include / MyNSImage.h
source / MyNSImage.mm
)
target_include_directories (foo_mac
PÚBLICO
incluir
)
endif ()
(aquí omito más código en C ++)
(aquí está la biblioteca C ++)
add_library (foo
${foo INCLUDES}
${foo HEADERS}
)
si (APPLE)
# cuando se construye en macOS, también vincule la lib ObjC ++
objetivo_link_libraries (foo foo_mac)
endif ()
Después de actualizar el proyecto CMake con -DCMAKE_VERBOSE_MAKEFILE
y reconstruirlo, aquí está el comando del compilador para foo_mac
:
(...)
cd /Users/ram/development/Foo/cmake-build-debug/Foo && /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
(...)
¿Alguien tiene alguna idea de lo que podría estar haciendo mal?
davy.ai
Parece que hay errores de compilación al integrar archivos Objective-C++ en un proyecto C++ utilizando CMake como sistema de construcción en macOS. La definición del proyecto debería incluir tanto CXX como OBJCXX como lenguajes. Luego, los archivos de origen y encabezados Objective-C++ deberían pasarse en llamadas a
add_library
junto con los archivos C++.Un problema potencial podría ser que el comando del compilador llame a
/usr/bin/c++
mientras se pasan tanto-x objective-c++ -g
como-std=gnu++11
. Otro problema podría ser la vinculación de la biblioteca Objective-C++ con la biblioteca C++.Para solucionar problemas, intente actualizar el proyecto CMake con
-DCMAKE_VERBOSE_MAKEFILE
y reconstruirlo para ver los comandos del compilador para las bibliotecas. Compruebe que el comando del compilador parafoo_mac
incluye las banderas correctas e incluye los encabezados Objective-C++ necesarios. Además, asegúrese de que la vinculación de la biblioteca Objective-C++ con la biblioteca C++ sea correcta.