Получение нескольких ошибок CMake - PullRequest
0 голосов
/ 01 мая 2020

Я новичок в CMake и экспериментировал с ним. Вот структура папок: Структура проекта

У меня есть CMakeLists.txt в каждой папке. Основные CMakeLists.txt:

cmake_minimum_required(VERSION 3.16.3)
cmake_policy(SET CMP0076 NEW)

project(game_of_life)

add_subdirectory(console)

add_subdirectory(game)

# add_subdirectory(sdl)

set (SRC main.c)

add_executable(${PROJECT_NAME} "")
target_sources(${PROJECT_NAME} PUBLIC ${SRC})

target_link_libraries(${PROJECT_NAME} PUBLIC console game)

install(TARGETS ${PROJECT_NAME})

И все остальные CMakeLists.txt схожи между собой:

cmake_minimum_required(VERSION 3.16.3)
cmake_policy(SET CMP0076 NEW)

project(console_ame_of_life)

SET(VALUE CACHE STRING "console_value")

add_library(${PROJECT_NAME} board_drawer.h)

target_sources(${PROJECT_NAME} PUBLIC board_drawer.c board_drawer.h)

target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(${PROJECT_NAME} INTERFACE m)

target_compile_definitions(${PROJECT_NAME} PUBLIC USING_LIB=$VALUE)


install(TARGETS ${PROJECT_NAME})
install(FILES game.h DESTINATION include)

Когда я запускаю команду make в папке build, он выдает следующие ошибки

/usr/bin/ld: cannot find -lconsole
/usr/bin/ld: cannot find -lgame
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/game_of_life.dir/build.make:84: game_of_life] Error 1
make[1]: *** [CMakeFiles/Makefile2:117: CMakeFiles/game_of_life.dir/all] Error 2
make: *** [Makefile:130: all] Error 2

Я включил их в main.c следующим образом:

#include "game/game.h"
#include "console/board_drawer.h"

Я искал эти ошибки, но не смог найти подходящий ответ. Не могли бы вы объяснить, что означают эти ошибки и что их вызывает. Спасибо за ваше время

1 Ответ

0 голосов
/ 01 мая 2020

Команда target_sources() (вместе с всеми из команд target_*) должна указывать существующую цель CMake в качестве первого аргумента. Цели CMake генерируются вызовами add_library() или add_executable().

Также обратите внимание, что переменная ${PROJECT_NAME} содержит имя, данное самой последней вызванной команде project(). Итак, ваш код:

project(console_ame_of_life)

add_library(${PROJECT_NAME} board_drawer.h)

создаст цель библиотеки CMake с именем console_ame_of_life.

Впоследствии при вызовах target_link_libraries() вы можете использовать целевые имена CMake или имена реальных библиотек в вашей системе. Поскольку цели console и game имеют , а не , были определены, CMake вместо этого пытается найти в вашей системе библиотеки с именами console и game. Это приводит к вашему сообщению об ошибке.

Чтобы это исправить, просто убедитесь, что имена целей совпадают. Вы можете изменить имя цели с console_ame_of_life на console, например:

cmake_minimum_required(VERSION 3.16.3)
cmake_policy(SET CMP0076 NEW)

project(console_ame_of_life)

SET(VALUE CACHE STRING "console_value")

# Here, you should specify the library type (e.g. STATIC or SHARED).
add_library(console SHARED)

target_sources(console PUBLIC board_drawer.c board_drawer.h)

target_include_directories(console PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(console INTERFACE m)

target_compile_definitions(console PUBLIC USING_LIB=$VALUE)


install(TARGETS console)
install(FILES game.h DESTINATION include)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...