Comment les bibliothèques de liens avec cmake?
Je ne peux pas obtenir les bibliothèques supplémentaires, je travaille avec un lien dans mon projet correctement.
Je suis à l'aide de CLion, qui utilise cmake pour construire ses projets. Je suis en train d'utiliser plusieurs bibliothèques en collaboration avec OpenGL pour la texture des objets. J'ai d'abord intégré dans Visual Studio, parce que je n'arrivais pas à comprendre comment obtenir de cmake pour travailler avec Clion. Toutefois, maintenant que le code est tout de travail (dans Visual Studio, de toute façon), je veux être en mesure d'utiliser CLion pour elle, parce que c'est mon IDE préféré.
Je suis encore nouveau pour cmake, et je ne comprends pas ce que je fais de mal avec mon CMakeLists.txt
. Voici ce que j'ai:
cmake_minimum_required(VERSION 3.3)
project(texture_mapping)
find_package(OpenGL REQUIRED)
link_directories(${OPENGL_gl_LIBRARY})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp camera.h display.h display.cpp mesh.cpp mesh.h obj_loader.cpp obj_loader.h shader.cpp shader.h stb_image.c stb_image.h texture.cpp texture.h transform.h)
link_directories(texture_mapping ${PROJECT_SOURCE_DIR}/lib)
add_executable(texture_mapping ${SOURCE_FILES})
target_include_directories(texture_mapping PUBLIC ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(texture_mapping SDL2 SDL2main SDL2test glew32 glew32s ${OPENGL_gl_LIBRARY})
J'ai modifié jusqu'à ce qu'il ne me donne pas plus d'erreurs dans CLion, mais les fichiers d'en-tête sont toujours pas reconnu dans mon code.
Voici la structure de mon projet:
Donc, j'ai mis toutes les bibliothèques dont j'avais besoin, mais il ne semble pas être le fait de les reconnaître dans le code. Clion reconnaît dans le projet (ils n'apparaissent pas en rouge avec des erreurs), mais quand il est construit (quand je tente de l'exécuter dans le CLion), j'obtiens ces erreurs:
CMakeFiles\texture_mapping.dir/objects.a(mesh.cpp.obj): In function `ZN4MeshD2Ev':
...texture-mapping/mesh.cpp:30: undefined reference to `_imp____glewDeleteVertexArrays'
CMakeFiles\texture_mapping.dir/objects.a(mesh.cpp.obj): In function `ZN4Mesh8InitMeshERK12IndexedModel':
...texture-mapping/mesh.cpp:36: undefined reference to `_imp____glewGenVertexArrays'
...texture-mapping/mesh.cpp:37: undefined reference to `_imp____glewBindVertexArray'
...texture-mapping/mesh.cpp:39: undefined reference to `_imp____glewGenBuffers'
...texture-mapping/mesh.cpp:40: undefined reference to `_imp____glewBindBuffer'
...texture-mapping/mesh.cpp:41: undefined reference to `_imp____glewBufferData'
...texture-mapping/mesh.cpp:43: undefined reference to `_imp____glewEnableVertexAttribArray'
...texture-mapping/mesh.cpp:44: undefined reference to `_imp____glewVertexAttribPointer'
...texture-mapping/mesh.cpp:46: undefined reference to `_imp____glewBindBuffer'
...texture-mapping/mesh.cpp:47: undefined reference to `_imp____glewBufferData'
...texture-mapping/mesh.cpp:49: undefined reference to `_imp____glewEnableVertexAttribArray'
...texture-mapping/mesh.cpp:50: undefined reference to `_imp____glewVertexAttribPointer'
...texture-mapping/mesh.cpp:52: undefined reference to `_imp____glewBindBuffer'
...texture-mapping/mesh.cpp:53: undefined reference to `_imp____glewBufferData'
...texture-mapping/mesh.cpp:55: undefined reference to `_imp____glewBindVertexArray'
...texture-mapping/mesh.cpp:56: undefined reference to `_imp____glewBindVertexArray'
CMakeFiles\texture_mapping.dir/objects.a(mesh.cpp.obj): In function `ZN4Mesh4DrawEv':
...texture-mapping/mesh.cpp:61: undefined reference to `_imp____glewBindVertexArray'
...texture-mapping/mesh.cpp:65: undefined reference to `_imp____glewBindVertexArray'
CMakeFiles\texture_mapping.dir/objects.a(shader.cpp.obj): In function `ZN6ShaderC2ERKSs':
...texture-mapping/shader.cpp:5: undefined reference to `_imp____glewCreateProgram'
...texture-mapping/shader.cpp:11: undefined reference to `_imp____glewAttachShader'
...texture-mapping/shader.cpp:14: undefined reference to `_imp____glewBindAttribLocation'
...texture-mapping/shader.cpp:15: undefined reference to `_imp____glewBindAttribLocation'
...texture-mapping/shader.cpp:17: undefined reference to `_imp____glewLinkProgram'
...texture-mapping/shader.cpp:20: undefined reference to `_imp____glewValidateProgram'
...texture-mapping/shader.cpp:23: undefined reference to `_imp____glewGetUniformLocation'
CMakeFiles\texture_mapping.dir/objects.a(shader.cpp.obj): In function `ZN6Shader4BindEv':
...texture-mapping/shader.cpp:28: undefined reference to `_imp____glewUseProgram'
CMakeFiles\texture_mapping.dir/objects.a(shader.cpp.obj): In function `ZN6Shader6UpdateERK9TransformRK6Camera':
...texture-mapping/shader.cpp:35: undefined reference to `_imp____glewUniformMatrix4fv'
CMakeFiles\texture_mapping.dir/objects.a(shader.cpp.obj): In function `ZN6ShaderD2Ev':
...texture-mapping/shader.cpp:42: undefined reference to `_imp____glewDetachShader'
...texture-mapping/shader.cpp:43: undefined reference to `_imp____glewDeleteShader'
...texture-mapping/shader.cpp:46: undefined reference to `_imp____glewDeleteProgram'
CMakeFiles\texture_mapping.dir/objects.a(shader.cpp.obj): In function `ZN6Shader16CheckShaderErrorEjjbRKSs':
...texture-mapping/shader.cpp:79: undefined reference to `_imp____glewGetProgramiv'
...texture-mapping/shader.cpp:81: undefined reference to `_imp____glewGetShaderiv'
...texture-mapping/shader.cpp:86: undefined reference to `_imp____glewGetProgramInfoLog'
...texture-mapping/shader.cpp:88: undefined reference to `_imp____glewGetShaderInfoLog'
CMakeFiles\texture_mapping.dir/objects.a(shader.cpp.obj): In function `ZN6Shader12CreateShaderERKSsj':
...texture-mapping/shader.cpp:96: undefined reference to `_imp____glewCreateShader'
...texture-mapping/shader.cpp:109: undefined reference to `_imp____glewShaderSource'
...texture-mapping/shader.cpp:110: undefined reference to `_imp____glewCompileShader'
CMakeFiles\texture_mapping.dir/objects.a(texture.cpp.obj): In function `ZN7Texture4BindEj':
...texture-mapping/texture.cpp:36: undefined reference to `_imp____glewActiveTexture'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0x24): undefined reference to `SDL_SetMainReady'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0x55): undefined reference to `SDL_malloc'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0x84): undefined reference to `SDL_wcslen'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0xa5): undefined reference to `SDL_iconv_string'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0xcf): undefined reference to `SDL_free'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0xf4): undefined reference to `SDL_wcslen'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0x10f): undefined reference to `SDL_iconv_string'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0x143): undefined reference to `SDL_malloc'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0x17f): undefined reference to `SDL_free'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0x18b): undefined reference to `SDL_free'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0x1d6): undefined reference to `SDL_isspace'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0x295): undefined reference to `SDL_isspace'
...texture-mapping/lib/SDL2main.lib(./Win32/Release/SDL_windows_main.obj):(.text+0x3a2): undefined reference to `SDL_ShowSimpleMessageBox'
Fondamentalement, les erreurs à chaque utilisation de la SDL et glew, mais pas glm, ce qui est étrange.
Ce que je fais mal avec mon CMakeLists.txt
?
OriginalL'auteur Cache Staheli | 2016-09-20
Vous devez vous connecter pour publier un commentaire.
Ma recommandation est de commencer simple et compliquer votre projet.
Laissez-moi vous expliquer la manière de relier les œuvres de CMake. L'idée est que vous construisez modules dans CMake, et de les lier ensemble. Nous allons ignorer les fichiers d'en-tête pour l'instant, car ils peuvent être inclus dans vos fichiers source.
Dire que vous avez file1.cpp, file2.cpp, main.cpp. Vous les ajoutez à votre projet avec:
Maintenant que vous l'avez ajouté à un module appelé
LibsModule
. Gardez cela à l'esprit.Dites vous souhaitez mettre un lien vers
pthread
par exemple qui est déjà dans le système. Vous pouvez les combiner avecLibsModule
à l'aide de la commande:Et si vous souhaitez lier une bibliothèque statique pour que, aussi, pour ce faire:
Et si vous voulez ajouter un répertoire où l'un de ces bibliothèques sont situées, pour ce faire:
Vous pouvez maintenant ajouter un fichier exécutable, et vous faites le lien avec votre fichier principal:
(J'ai ajouté BlaBla juste pour préciser que le nom est personnalisé). Et puis vous lien
LibsModule
avec votre module exécutableMyProgramExecBlaBla
Et cela va le faire.
Ce que je vois dans votre fichier CMake est un beaucoup de redondance. Par exemple, pourquoi avez-vous
texture_mapping
, qui est un module exécutable dans vos répertoires? Si vous avez besoin de nettoyer et de suivre la logique simple je l'ai expliqué. Espérons que cela fonctionne.En résumé, il ressemble à ceci:
La chose la plus importante à comprendre est que la structure du module, où vous créez des modules et de les relier tous ensemble, avec votre exécutable. Une fois que cela fonctionne, vous pouvez compliquer votre projet avec plus de détails. Bonne chance!
Remarque: Gardez à l'esprit que c'est le moyen le plus simple à utiliser CMake. Le meilleur de la croix-plate-forme serait à l'aide de
find_package
, qui permet de localiser un paquet/la bibliothèque, et fournit les bibliothèques et les inclut dans les variables CMake, de sorte que vous pouvez lier votre programme. Voici comment faire pour stimuler la, par exemple.add_library()
avec eux. En outre, supposons que j'ai un dossierlib/
où la.lib
fichiers sont stockés. Si j'utilisetarget_link_libraries(texture_module -L${PROJECT_SOURCE_DIR}/lib)
, le fait automatiquement joindre tous les*.lib
fichiers à la cible?Comment faire un lien vers ces bibliothèques spécifiques, je ne sais pas exactement. Mais une fois que vous avez la bonne façon de le faire (ce qui n'a rien à voir avec cmake), essayez de mettre chacun d'eux en une seule ligne, et par la suite après il fonctionne expérience de les mettre tous dans un seul
target_link_libraries
. Et si tout est ajoutée automatiquement par l'ajout d'un répertoire, je doute fortement que. Vous avez un lien à chaque bibliothèque manuellement. Le-L
liaison que dit l'éditeur de liens où trouver les bibliothèques que vous avez spécifié.OriginalL'auteur The Quantum Physicist