Как использовать фреймворк с помощью Cmake?
Для Macos я бы хотел добавить ссылку на некоторые рамки. В окнах я хотел бы сделать ссылку на какую-то библиотеку.
Например, OpenGL Framework, как выразить это требование с помощью cmake?
4 ответа
Вы можете попробовать следующий код:
target_link_libraries(<target name>
"-framework AVFoundation"
"-framework CoreGraphics"
"-framework CoreMotion"
"-framework Foundation"
"-framework MediaPlayer"
"-framework OpenGLES"
"-framework QuartzCore"
"-framework UIKit"
)
Чтобы сообщить CMake, что вы хотите связать с OpenGL, добавьте следующее в ваш CMakeLists.txt
:
find_package(OpenGL REQUIRED)
include_directories(${OPENGL_INCLUDE_DIR})
target_link_libraries(<your program name> ${OPENGL_LIBRARIES})
find_package
будет искать OpenGL и сообщать остальной части скрипта, где находится OpenGL, устанавливая некоторые переменные OPENGL*. include_directories
говорит вашему компилятору, где найти заголовки OpenGL. target_link_libraries
указывает CMake на ссылку в OpenGL.
Следующий код будет выполнять различные действия в зависимости от операционной системы:
if(WIN32)
#Windows specific code
elseif(APPLE)
#OSX specific code
endif()
Вы можете попробовать следующий код макроса:
macro(ADD_OSX_FRAMEWORK fwname target)
find_library(FRAMEWORK_${fwname}
NAMES ${fwname}
PATHS ${CMAKE_OSX_SYSROOT}/System/Library
PATH_SUFFIXES Frameworks
NO_DEFAULT_PATH)
if( ${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND)
MESSAGE(ERROR ": Framework ${fwname} not found")
else()
TARGET_LINK_LIBRARIES(${target} PUBLIC "${FRAMEWORK_${fwname}}/${fwname}")
MESSAGE(STATUS "Framework ${fwname} found at ${FRAMEWORK_${fwname}}")
endif()
endmacro(ADD_OSX_FRAMEWORK)
пример
ADD_OSX_FRAMEWORK(Foundation ${YOUR_TARGET}) # Add the foundation OSX Framework
Вы можете найти этот пример кода здесь
Для нестандартной структуры
cmake version 3.20.1
https://github.com/Sunbreak/cli-breakpad.trial/blob/master/CMakeLists.txt#L10-L12
if(APPLE)
find_library(BREAKPAD_CLIENT Breakpad "${CMAKE_CURRENT_SOURCE_DIR}/breakpad/mac/")
target_link_libraries(cli-breakpad PRIVATE ${BREAKPAD_CLIENT})