es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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 para foo_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.

Comments are closed.