119 votes

CMake incapable de déterminer le langage du lieur avec C++

Je tente d'exécuter un programme "hello world" cmake sur Windows 7 x64 avec à la fois Visual Studio 2010 et Cygwin, mais je n'arrive pas à faire fonctionner l'un ou l'autre. Ma structure de répertoire est la suivante:

HelloWorld
-- CMakeLists.txt
-- src/
-- -- CMakeLists.txt
-- -- main.cpp
-- build/

Je fais un cd build suivi d'un cmake .., et je reçois une erreur indiquant que

Erreur CMake: CMake ne peut pas déterminer le langage du lien pour la cible : helloworld
Erreur CMake: Impossible de déterminer le langage de liaison pour la cible "helloworld".

Cependant, si je change l'extension de main.cpp en main.c à la fois sur mon système de fichiers et dans src/CMakeLists.txt, tout fonctionne comme prévu. C'est le cas en exécutant à la fois à partir de l'Invite de commandes Visual Studio (Générateur de solutions Visual Studio) et du Terminal Cygwin (Générateur de makefiles Unix).

Avez-vous une idée de pourquoi ce code ne fonctionnerait pas?

CMakeLists.txt

PROJECT(HelloWorld C)
cmake_minimum_required(VERSION 2.8)

# inclure le répertoire des modules cmake
set(CMAKE_MODULE_PATH ${HelloWorld_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})

add_subdirectory(src)

src/CMakeLists.txt

# Inclure le répertoire lui-même en tant que chemin vers les répertoires d'inclusion
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Créer une variable appelée helloworld_SOURCES contenant tous les fichiers .cpp :
set(HelloWorld_SOURCES main.cpp)

# Créer un fichier exécutable appelé hello à partir des sources :
add_executable(hello ${HelloWorld_SOURCES })

src/main.cpp

int main()
{
  return 0;
}

234voto

Joakim Points 1224

J'ai aussi eu l'erreur que vous mentionnez :

Erreur de CMake: CMake ne peut pas déterminer le langage du lien pour la cible : helloworld
Erreur de CMake: Impossible de déterminer le langage de lien pour la cible "helloworld".

Dans mon cas, cela était dû au fait d'avoir des fichiers C++ avec l'extension .cc.

Si CMake n'arrive pas à déterminer correctement le langage du code, vous pouvez utiliser ce qui suit :

set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)

La réponse acceptée qui suggère d'ajouter le langage à l'instruction project() ajoute simplement une vérification plus stricte du langage utilisé (selon la documentation), mais cela ne m'a pas été utile :

En option, vous pouvez spécifier les langages pris en charge par votre projet. Les langages exemples sont CXX (c'est-à-dire C++), C, Fortran, etc. Par défaut, C et CXX sont activés. Par exemple, si vous n'avez pas de compilateur C++, vous pouvez désactiver la vérification en l'explicitant dans les langages que vous souhaitez prendre en charge, par exemple C. En utilisant le langage spécial "NONE", toutes les vérifications pour n'importe quel langage peuvent être désactivées. Si une variable appelée CMAKE_PROJECT__INCLUDE_FILE existe, le fichier pointé par cette variable sera inclus en dernier lieu lors de la commande du projet.

90voto

Moebius Points 116

Dans mon cas, c'était juste parce qu'il n'y avait pas de fichier source dans la cible. Tout mon code était un modèle avec le code source dans le fichier d'en-tête. Ajouter un fichier vide file.cpp a résolu le problème.

51voto

olovb Points 528

Essayez de changer

PROJECT(HelloWorld C)

en

PROJECT(HelloWorld C CXX)

ou simplement

PROJECT(HelloWorld)

Voir: https://cmake.org/cmake/help/latest/command/project.html

18voto

Jolly Roger Points 223

Aussi déroutant que cela puisse être, l'erreur se produit également lorsqu'un fichier cpp inclus dans le projet n'existe pas.

Si vous répertoriez vos fichiers source dans CMakeLists.txt et que vous saisissez par erreur un nom de fichier, vous obtiendrez cette erreur.

9voto

zhm Points 101

Je veux ajouter une autre solution au cas où une bibliothèque sans fichiers source serait construite. Ces bibliothèques sont également connues sous le nom de bibliothèques header only. Par défaut, add_library attend au moins un fichier source ajouté sinon l'erreur mentionnée se produit. Comme les bibliothèques header only sont assez courantes, cmake utilise le mot-clé INTERFACE pour construire de telles bibliothèques. Le mot-clé INTERFACE est utilisé comme indiqué ci-dessous et élimine le besoin de fichiers source vides ajoutés à la bibliothèque.

add_library(myLibrary INTERFACE)
target_include_directories(myLibrary INTERFACE {CMAKE_CURRENT_SOURCE_DIR})

L'exemple ci-dessus construirait une bibliothèque header only incluant tous les fichiers d'en-tête dans le même répertoire que le fichier CMakeLists.txt. Remplacez {CMAKE_CURRENT_SOURCE_DIR} par un chemin si vos fichiers d'en-tête se trouvent dans un répertoire différent du fichier CMakeLists.txt.

Jetez un œil à ce billet de blog ou à la documentation cmake pour plus d'informations sur les bibliothèques header only et cmake.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X