Я создал минималистическую библиотеку 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=SIMULATORxcodebuild -target install -configuration DebugВ основном, что происходит, я создаю две библиотеки, одну внутри core/, которая вычисляет квадратный корень числа, другую в platform/, которая является оболочкой ObjC для библиотеки вычисления квадратного корня C++. Я связываю ядро/библиотеку внутри платформы/библиотеки.
Проблема:
Проблема в том, что я не могу связать библиотеку, сгенерированную внутри core/, с библиотекой, сгенерированной внутри platform/. Код прекрасно строится, и создается библиотека (и соответствующий заголовочный файл .h).
Однако, если я попытаюсь использовать его в своем Xcode, он скажет следующее:
Очевидно, что функции библиотеки core/ недоступны внутри platform/.
Я пробовал возиться с флагами C и CXX, пытаясь сначала добавить библиотеку, используя find_library, и используя другую цепочку инструментов, например, это здесь.
Технические характеристики платформы:
Платформа (для которой создается библиотека, это симулятор iOS, где она будет использоваться приложением iOS), она создается на macOS.





Предположим, что 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 :(
Я обновил его. Кстати, вы должны убедиться, что libcore_lib.a находится в каталоге ${PROJECT_SOURCE_DIR}/core
Опять та же ошибка. Это нормально работает на вашем компьютере (при условии, что вы пробовали это?) Также ${PROJECT_SOURCE_DIR}/core - правильный каталог, проверено с помощью команды message
извините, у меня сейчас нет ios env. Но в моем варианте этот тип ошибки вызван включением заголовка (i) path (ii) lib (iii). Обновляю снова.
Как сейчас написано, ваш ответ неясен. Пожалуйста, редактировать, чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
Хорошо, я наконец понял, в чем была проблема.
platform/ не может разрешить свою зависимость от core/), если я явно не добавлю их обе в Xcode.core/ и platform/) в Xcode.Объяснение:
Статическая библиотека: хотя вы указываете зависимость, она не разрешается цепочкой инструментов. Вам нужно будет указать все зависимости для окончательного исполняемого файла.
libB зависит от libA, тогда при связывании hello.exe, который вызывает только методы libB, вы должны указать как libB.a, так и libA.a, чтобы он работалДинамическая/общая библиотека: Решены зависимости ч/б библиотек; достаточно просто указать зависимость, необходимую для окончательного исполняемого файла.
libB.dyliblibA.dylibИтак, либо создайте динамическую библиотеку, либо добавьте все зависимости статической библиотеки в Xcode.
В Core/CMakeLists.txt вы можете добавить:
target_include_directories(core_lib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
В другом целевом объекте, который связан с core_lib, он будет включать каталог «Core».
Платформа macOS или iOS?