Estou tentando criar um projeto CMake com 2 alvos. Um deles deve ser uma biblioteca e o outro um executável. Mas quando tento construir o executável, recebo um erro dizendo que a biblioteca não foi encontrada.
Biblioteca CMake:
file(GLOB SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp)
set(HEADERS include)
add_library(arcade-lib STATIC ${SOURCES})
target_include_directories(arcade-lib PUBLIC ${HEADERS})
target_link_libraries(arcade-lib PRIVATE sfml-window sfml-graphics)
CMake executável:
file(GLOB SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp)
set(INCLUDE include)
set(ARCADE_GAMES_LIB_INCLUDE ../arcade-games-lib/include)
add_executable(snake-game snake-game.cpp ${SOURCES})
target_link_libraries(snake-game PRIVATE arcade-games-lib sfml-graphics sfml-window sfml-system sfml-main )
target_include_directories(snake-game PRIVATE ${INCLUDE} ${ARCADE_GAMES_LIB_INCLUDE})
CMake principal:
cmake_minimum_required(VERSION 3.25)
project(arcade_games)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc")
set(SFML_STATIC_LIBRARIES TRUE)
find_package(SFML 2.5 COMPONENTS graphics window system REQUIRED)
add_subdirectory(arcade-games-lib)
add_subdirectory(snake-game)
Mensagem de erro:
C:\Program Files\JetBrains\CLion 2022.3.2\bin\mingw\bin/ld.exe: cannot find -larcade-games-lib
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
Eu nem sei o que fazer, porque tudo parece certo. Eu esperava que um arquivo executável fosse criado que incluísse minha biblioteca
O problema, conforme apontado nos comentários, era que os nomes da biblioteca
add_library
etarget_link_libraries
precisavam corresponder.Usar
file(GLOB
para coletar arquivos de origem é problemático, conforme apontado por @Botje e em Por que o arquivo cmake GLOB é mau?Tomei a liberdade de remover um pouco do seu CMakeLists.txt:
Biblioteca CMake:
CMake executável: