Bâtiment de la bibliothèque avec cmake
Je m'excuse de vous déranger tous, mais j'ai un petit problème de compilation avec cmake.
J'ai un CMakeLists.txt le fichier que j'utilise pour construire un test exécutable, et une bibliothèque partagée. Ils ont tous les deux la dépendance à une autre bibliothèque (SFML).
Je suis en utilisant cmake sur la fenêtre avec MinGW.
Je sais le nom de la lib, je suis en train de construire est un peu confus, avec la sfml, mais il est censé être un SFML wrapper, donc, je n'ai pas trouver un meilleur nom!
Ici la CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(projectName)
set(EXECUTABLE_NAME testSFML)
set(LIBRARY_NAME SFMLwindow)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin/)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include /
${CMAKE_CURRENT_SOURCE_DIR}/../../include
)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../lib/)
file(
GLOB_RECURSE
SRC_FILES
src/*
)
file(
GLOB_RECURSE
INCLUDE_FILES
include/*
)
add_executable(
${EXECUTABLE_NAME}
main.cpp
${SRC_FILES}
${INCLUDE_FILES}
)
target_link_libraries(
${EXECUTABLE_NAME}
sfml-main
sfml-system
sfml-window
)
add_library(
${LIBRARY_NAME}
SHARED
${SRC_FILES}
)
Et ce que je reçois dans le terminal :
"C:\MinGW\bin\mingw32-make.exe"
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/iksemel/docs/WorkBench/programming/projets/TestSFML/cmake
Linking CXX shared library libSFMLwindow.dll
Creating library file: libSFMLwindow.dll.a
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x59):undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj'
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0xda): undefined reference to `_imp___ZN2sf6WindowC1ENS_9VideoModeERKSsjRKNS_15ContextSettingsE'
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x163): undefined reference to `_imp___ZN2sf6Window5closeEv'
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x1bd): undefined reference to `_imp___ZN2sf6Window9pollEventERNS_5EventE'
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x1d8): undefined reference to `_imp___ZN2sf6Window7displayEv'
collect2: ld a retourné 1 code d'état d'exécution
mingw32-make.exe[2]: *** [libSFMLwindow.dll] Error 1
mingw32-make.exe[1]: *** [CMakeFiles/SFMLwindow.dir/all] Error 2
mingw32-make.exe: *** [all] Error 2
Si quelqu'un a une idée sur ce qui se passe, je lui en serais très reconnaissante!
OriginalL'auteur Cuthalion | 2012-06-27
Vous devez vous connecter pour publier un commentaire.
À une supposition, votre
SFMLwindow
bibliothèque besoins liés à certaines ou à toutes sfml-main, sfml-system, sfml-window.Vous pourriez essayer de changer la fin de votre CMakeLists.txt pour:
En aparté,
file(GLOB_RECURSE...
est généralement mal vu comme un moyen de rassembler une liste de sources. À partir de la documentation pourfile
:Aussi,
find_library
devrait être préféré àlink_directories
dans ce cas. À partir de la documentation pourlink_directories
:J'ai compris le problème! Vous aviez raison sur le problème de liaison, mais pour le corriger, j'ai dû utiliser 2 target_link_libraries. L'un pour l'exécutable et l'autre pour la bibliothèque. L'autre problème que j'ai eu était la commande la commande. Il semble que le target_link_libraries doit apparaître après add_executable et add_library. Voici mon cmake, et encore une fois, merci pour l'information générale à propos de cmake et de m'aider! pastebin.com/ErgbGir0
OK content que ça fonctionne. La principale différence entre nos solutions est que vous compilez les sources à la fois dans la bibliothèque et l'exe. C'est OK pour les petits projets, mais devient une douleur si vous avez beaucoup de fichiers source. Normalement, vous seriez compiler les sources qu'une seule fois dans la bibliothèque, puis juste le lien de la bibliothèque à l'épreuve exe. Avec CMake, si vous spécifiez que les lib A dépend de la lib B, et exe Z dépend de la lib Un, puis il ajoute automatiquement lib B en tant que dépendance de Z aussi. C'est pourquoi j'ai précisé juste
${LIBRARY_NAME}
comme la dépendance de${EXECUTABLE_NAME}
. Pas trop grave si 🙂Encore une fois, merci beaucoup pour ton expérience! J'ai maintenant de comprendre clairement ce que vous avez voulu me faire, et je dois admettre que votre solution est très efficace! J'ai édité mon CMakeLists.txt selon vous : pastebin.com/xL5FATsL
OriginalL'auteur Fraser