Xcode, CMake не может связать библиотеку C++ с библиотекой ObjC++

Я создал минималистическую библиотеку C++, которую хочу использовать в своем проекте Xcode. Он имеет эту структуру каталогов -

library/
 
    - CMakeLists.txt
    - build/    // build files will reside here 
    - iOS.cmake // toolchain file
    - core/
        - CMakeLists.txt
        - squareroot.h
        - squareroot.cpp
    - platform/
        - CMakeLists.txt
        - squrerootwrapper.h
        - squarerootwrapper.mm

Ссылка на проект - https://github.com/devojoyti/CMakeLibrary

Внутри build/ делаю -

  • cmake ../ -G Xcode -D CMAKE_TOOLCHAIN_FILE=../iOS.cmake -D IOS_PLATFORM=SIMULATOR
  • xcodebuild -target install -configuration Debug

В основном, что происходит, я создаю две библиотеки, одну внутри core/, которая вычисляет квадратный корень числа, другую в platform/, которая является оболочкой ObjC для библиотеки вычисления квадратного корня C++. Я связываю ядро/библиотеку внутри платформы/библиотеки.

Проблема:

Проблема в том, что я не могу связать библиотеку, сгенерированную внутри core/, с библиотекой, сгенерированной внутри platform/. Код прекрасно строится, и создается библиотека (и соответствующий заголовочный файл .h).

Однако, если я попытаюсь использовать его в своем Xcode, он скажет следующее:

Xcode, CMake не может связать библиотеку C++ с библиотекой ObjC++

Очевидно, что функции библиотеки core/ недоступны внутри platform/.

Я пробовал возиться с флагами C и CXX, пытаясь сначала добавить библиотеку, используя find_library, и используя другую цепочку инструментов, например, это здесь.

Технические характеристики платформы:

  • MacOS Big Sur, 11.6.5, 2,3 ГГц i9
  • CMake — 3.22.2
  • Xcode-13.2.1

Платформа macOS или iOS?

Willeke 04.04.2022 17:10

Платформа (для которой создается библиотека, это симулятор iOS, где она будет использоваться приложением iOS), она создается на macOS.

devojoyti 04.04.2022 17:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
150
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Предположим, что libcore_lib.a находится в разделе core/

find_package(CORE core_lib HINTS ${PROJECT_SOURCE_DIR}/core)
include_directories(${PROJECT_SOURCE_DIR}/core)
add_library(pim_ios ${PLATFORM_SOURCES})
target_link_libraries(pim_ios ${CORE})
target_link_libraries(pim_ios PUBLIC "-framework Cocoa" "-framework AppKit" "-framework CoreData" "-framework Foundation")

Пишет - CMake Error: The following variables are used in this project, but they are set to NOTFOUND. Please set them or make sure they are set and tested correctly in the CMake files: CORE linked by target "pim_ios" in directory /Users/****/Work/library/platform В принципе не может найти core_lib :(

devojoyti 03.04.2022 13:59

Я обновил его. Кстати, вы должны убедиться, что libcore_lib.a находится в каталоге ${PROJECT_SOURCE_DIR}/core

longky 03.04.2022 15:20

Опять та же ошибка. Это нормально работает на вашем компьютере (при условии, что вы пробовали это?) Также ${PROJECT_SOURCE_DIR}/core - правильный каталог, проверено с помощью команды message

devojoyti 03.04.2022 17:00

извините, у меня сейчас нет ios env. Но в моем варианте этот тип ошибки вызван включением заголовка (i) path (ii) lib (iii). Обновляю снова.

longky 03.04.2022 18:01

Как сейчас написано, ваш ответ неясен. Пожалуйста, редактировать, чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.

Community 03.04.2022 23:54
Ответ принят как подходящий

Хорошо, я наконец понял, в чем была проблема.

  • Библиотеки, которые я создавал, были библиотеками статический.
  • Статические библиотеки не могут разрешить свои зависимости самостоятельно (т. е. здесь библиотека в platform/ не может разрешить свою зависимость от core/), если я явно не добавлю их обе в Xcode.
  • Он начал работать после того, как я добавил обе библиотеки (библиотека core/ и platform/) в Xcode.

Объяснение:

  • Статическая библиотека: хотя вы указываете зависимость, она не разрешается цепочкой инструментов. Вам нужно будет указать все зависимости для окончательного исполняемого файла.

    • например: libB зависит от libA, тогда при связывании hello.exe, который вызывает только методы libB, вы должны указать как libB.a, так и libA.a, чтобы он работал
  • Динамическая/общая библиотека: Решены зависимости ч/б библиотек; достаточно просто указать зависимость, необходимую для окончательного исполняемого файла.

    • Вам все равно нужно убедиться, что оба .dylib находятся в одном каталоге для загрузки libB.dyliblibA.dylib

Итак, либо создайте динамическую библиотеку, либо добавьте все зависимости статической библиотеки в Xcode.

В Core/CMakeLists.txt вы можете добавить:

target_include_directories(core_lib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)

В другом целевом объекте, который связан с core_lib, он будет включать каталог «Core».

Другие вопросы по теме