Вот как я бы установил такой проект:
./CMakeLists.txt
:
cmake_minimum_required(VERSION 3.0.2)
project(my_game)
add_subdirectory(game)
add_subdirectory(game-client)
add_subdirectory(game-server)
Обратите внимание, что очень важно, чтобы подкаталоги добавлялись в обратном порядке зависимости. Например, game-server
зависит от game
, поэтому его следует добавить после него.
./game/CMakeLists.txt
:
find_package(Lua REQUIRED)
add_library(game utils.cpp)
target_include_directories(game PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${LUA_INCLUDE_DIR})
target_link_libraries(game PUBLIC ${LUA_LIBRARIES})
Здесь решающее значение имеют target_include_directories
и target_link_libraries
. Когда вы используете режим PUBLIC
, вы сообщаете cmake
, что каждая цель, которая зависит от вашей библиотеки, должна также иметь эти каталоги, добавленные в путь поиска препроцессора, и если это исполняемый файл, он также должен быть связан с вашими зависимостями.
./game-client/CMakeLists.txt
:
add_executable(game-server main.cpp)
target_link_libraries(game-server PUBLIC game)
Вам также необходимо сообщить cmake
, что ваш исполняемый файл зависит от вашей библиотеки.
Вот пример (исходный код примера находится в /tmp/so/game
)
$ make VERBOSE=1 | grep main.cpp
[...]
cd /tmp/a/game-client && /usr/bin/c++ -I/tmp/so/game -I/usr/include/lua5.3 -o CMakeFiles/game-client.dir/main.cpp.o -c /tmp/so/game-client/main.cpp
/usr/bin/c++ -rdynamic CMakeFiles/game-client.dir/main.cpp.o -o game-client ../game/libgame.a -llua5.3 -lm