Конфигурация SDL + Chipmunk CMake

Я хочу связать физический фреймворк Chipmunk2D с SDL через CMake.

У меня есть следующая структура проекта:

MyProject
    -chipmunk:
      --include
      --demo:
        ---CMakeList.txt
      --src:
       ---CMakeList.txt
      --CMakeList.txt
    -src:
      --main.cpp
    -CMakeLists.txt

Я прочитал о статических и общих библиотеках и решил, что хочу использовать статическую библиотеку, поэтому я зашел в папку с бурундуками и запустил cmake .

1. Первый файл CMakeList устанавливает параметры:

  message(STATUS "Set BUILD_STATIC option ON")
  option(BUILD_SHARED "Build and install the shared library" ON)
  option(BUILD_STATIC "Build as static library" ON)
  option(INSTALL_STATIC "Install the static library" ON)

и после этого:

add_subdirectory(src)
  1. CMakeList.txt из src переходит к действию:

    
    if(BUILD_STATIC)
    message(STATUS "BUILDING chipmunk_static")
    add_library(chipmunk_static STATIC ${chipmunk_source_files})
    set_target_properties(chipmunk_static PROPERTIES OUTPUT_NAME chipmunk)
     if(INSTALL_STATIC)
       message(STATUS "INSTALL chipmunk_static ${LIB_INSTALL_DIR}")
       install(TARGETS chipmunk_static ARCHIVE DESTINATION {LIB_INSTALL_DIR})
     endif(INSTALL_STATIC)
    endif(BUILD_STATIC)
    

  2. В демо-папке CmakeFile делает следующее:

    
    set(chipmunk_demos_libraries
    chipmunk_static
    ${GLEW_LIBRARIES}
    ${OPENGL_LIBRARIES}
    )
    

S0 мои вопросы:

  1. Нужно ли мне запускать Makefiles из библиотек бурундуков только один раз, чтобы я мог собрать статическую библиотеку?
  2. После того, как я включил CMakefile от бурундука в свой Cmakefile, кажется, что он не может найти статическую библиотеку (кстати, я на Linux)
  3. Если у меня есть статическая библиотека, могу ли я удалить все содержимое src из бурундука и оставить только заголовки?

Моя попытка найти статическую библиотеку бурундука безуспешно:


add_subdirectory(chipmunk)
find_package(SDL2 REQUIRED)
find_library(CHIPMUNK_LIB chipmunk_static)
message(${CHIPMUNK_LIB})


person Gavriil    schedule 04.11.2018    source источник
comment
Несколько вопросов в вопроснике, и ни один не ясен. ... it seems it cannot found the static library - В сети много информации о подключении внешней библиотеки, в том числе вопросы по Stack Overflow. Что именно вы пробовали и какое точное сообщение об ошибке (или другое описание ошибки) вы получили?   -  person Tsyvarev    schedule 04.11.2018


Ответы (1)


Так что с CMake, когда вы «находите» библиотеку, она ищет установленную, а не созданную подпроектом. Итак, где-то у вас должна быть строка, в которой вы ссылаетесь на каталог, в котором есть Chipmunk. В моем проекте:

add_subdirectory(external/Chipmunk2D)

Затем, когда вы создаете свой исполняемый файл (или библиотеку, что угодно), вы можете просто перечислить библиотеки, созданные подпроектами, по имени. В моем случае glfw, chipmunk_static и enet создаются CMake в подпроектах:

target_link_libraries(my_executable
    ${OPENGL_LIBRARIES}
    glfw
    chipmunk_static
    enet
)
person slembcke    schedule 05.11.2018
comment
Есть ли смысл сохранять исходники в проекте после сборки библиотеки? - person Gavriil; 06.11.2018
comment
@Gavriil, поздний ответ, но хотите ли вы сохранить исходники в проекте после создания библиотеки, зависит от того, как вы хотите обрабатывать свои зависимости. Основываясь на ответе slembcke, может показаться, что он выступает за то, чтобы рассматривать исходные файлы Chipmunk2D как ваши собственные файлы, за исключением того, что вам не нужно самостоятельно писать для них файл CMakeList.txt, поскольку он уже есть. Если вы используете Git, вы можете, например, иметь Chipmunk2D в качестве подмодуля. - person nilo; 30.05.2021
comment
Спасибо за этот ответ. Для протокола: мне потребовалось некоторое время, чтобы понять, что chipmunk_static — это не какое-то произвольное имя, которое применимо только к какому-то конкретному проекту. Если предположить, что содержимое каталога GitHub Chipmunk2D находится в каталоге с таким же именем в дереве исходного кода, то chipmunk_static является целевым именем CMake для статической библиотеки Chipmunk2D. Вот почему простой target_link_libraries просто работает. В частности, для этого не нужны никакие target_link_directories. - person nilo; 30.05.2021