Я уже давно работаю над интересным проектом (игровым движком) и решил, что могу сделать его более переносимым и легко скомпилировать на разных платформах, если я использую 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, поэтому, пожалуйста, будьте осторожны, если это действительно просто.
Чтобы связать внешние библиотеки, наилучшей практикой является использование или создание 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)