Связывание статической библиотеки с общей библиотекой в cmake

0

Я уже давно работаю над интересным проектом (игровым движком) и решил, что могу сделать его более переносимым и легко скомпилировать на разных платформах, если я использую cmake. Прямо сейчас я настроил это так, с основным исполняемым файлом, а затем с кучей разделяемых библиотек, к которым связан исполняемый файл. Я нашел все материалы, необходимые для создания библиотек и исполняемого файла, и привязки их к исполняемому файлу, но как связать зависимость, например статическую библиотеку или другую общую библиотеку с одной из библиотек, которые я создаю? Вот визуальный

Sentiment      (name of project)
  -Root        (all the interfaces and components of the engine. main.cpp is here
  -Sentiment_OGL4Renderer    (the files for the Renderer library)
  -Sentiment_SFMLGui         (the files for the Gui library)
  -Sentiment_TestGame        (the code for a game)

теперь я хочу, чтобы все это, исполняемые и разделяемые библиотеки были созданы и помещены в папку bin в каталоге верхнего уровня. То, что я нашел в Интернете для такой настройки, было сделать файлы cmakelists.txt в каждой папке, а затем в корне для каждого проекта. То, что у меня есть до сих пор.

#Sentiment 
cmake_minimum_required(VERSION 2.6)
project(Sentiment)

set(RENDERER Sentiment_OGL4Renderer)
set(GUI Sentiment_SFMLGui)
set(GAME Test_Game)

add_definitions(-DBUILD_DLL)

list( APPEND CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")

set(EXECUTABLE_OUTPUT_PATH "${Sentiment_SOURCE_DIR}/bin")
set(LIBRARY_OUTPUT_PATH "${EXECUTABLE_OUTPUT_PATH}")
link_directories("${LIBRARY_OUTPUT_PATH}")

add_subdirectory("${RENDERER}")
add_subdirectory("${GUI}")
add_subdirectory("${GAME}")
add_subdirectory(Root)

в корне

project(Sentiment_exe)

link_directories("${Sentiment_SOURCE_DIR}/bin")

AUX_SOURCE_DIRECTORY(. new_source_list)

add_executable("${CMAKE_PROJECT_NAME}" ${new_source_list})
target_link_libraries("${CMAKE_PROJECT_NAME}" "${LIBRARY_OUTPUT_PATH}/${RENDERER}" "${LIBRARY_OUPUT_PATH}/${GUI}" "${LIBRARY_OUTPUT_PATH}/${GAME}" "${ADDITIONAL_DEPENDENCIES}")

в Sentiment_OGL4Renderer

project(Sentiment_OGL4-3Renderer)

include_directories(${Sentiment_SOURCE_DIR})
add_definitions(-DGLEW_STATIC)
add_library(Sentiment_OGL4-3Renderer SHARED Sentiment_OGL4Renderer.cpp GL/glew.cpp)

в Sentiment_SFMLGui

project(Sentiment_SFMLGui)

include_directories(${Sentiment_SOURCE_DIR})

add_library(Sentiment_SFMLGui SHARED Sentiment_SFMLGui.cpp)

в Sentiment_TestGame

project(Sentiment_Game)

include_directories(${Sentiment_SOURCE_DIR})

add_library(Sentiment_Game SHARED Game.cpp)

Как вы можете сказать, есть много сторонних библиотек, и я пробовал различные способы связывания, например, с target_link_libraries, и я не могу на всю жизнь понять, как связать внешнюю библиотеку с теми, которые я создал. Во-первых, средство визуализации использует GLEW, но не нуждается в внешней зависимости, поэтому игнорируйте это. Тогда ему нужны OpenGL32.lib и Gdi32.lib из windows sdk (только для окон). Что касается SFML, у меня есть DLL в папке bin, которую нужно связать (можно легко получить.so при работе в Linux и может распространяться с конечным продуктом, если я когда-нибудь захочу сделать это). Мне нужны эти все связанные как зависимости к библиотекам, которые я создаю, но ничего не работает. Проект все c++, и в настоящее время я использую mingw32 для его компиляции. Я новичок в cmake, поэтому, пожалуйста, будьте осторожны, если это действительно просто.

  • 0
    cmake.org/Wiki/CMake:How_To_Find_Libraries
  • 0
    Можете ли вы опубликовать ошибку, которую вы получаете?
Показать ещё 2 комментария
Теги:
cmake

1 ответ

1
Лучший ответ

Чтобы связать внешние библиотеки, наилучшей практикой является использование или создание FindModule для данной внешней библиотеки.

CMake поставляется с многочисленными модулями, которые помогают находить различные известные библиотеки и пакеты.

Список стандартных модулей приведен в официальной документации

Если в вашей внешней библиотеке нет стандартного модуля, вы должны написать свой собственный.

Библиотека OpenGL имеет стандартный модуль FindOpenGL:

find_package (OpenGL)
if (OPENGL_FOUND)
  include_directories(${OPENGL_INCLUDE_DIR})
  target_link_libraries (Sentiment_OGL4-3Renderer ${OPENGL_gl_LIBRARY})
endif (OPENGL_FOUND)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню