web-dev-qa-db-fra.com

CMake incapable de déterminer le langage de l'éditeur de liens avec C++

J'essaie de lancer un programme cmake hello world sous Windows 7 x64 avec Visual Studio 2010 et Cygwin, mais ne semble pas pouvoir fonctionner non plus. 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 j'obtiens une erreur indiquant que 

CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "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 à partir de l’invite de commande Visual Studio (Visual Studio Solution Generator) et du terminal Cygwin (Unix Makefiles Generator).

Une idée pourquoi ce code ne fonctionnerait pas?

CMakeLists.txt

PROJECT(HelloWorld C)
cmake_minimum_required(VERSION 2.8)

# include the cmake modules directory
set(CMAKE_MODULE_PATH ${HelloWorld_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})

add_subdirectory(src)

src/CMakeLists.txt

# Include the directory itself as a path to include directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Create a variable called helloworld_SOURCES containing all .cpp files:
set(HelloWorld_SOURCES main.cpp)

# Create an executable file called helloworld from sources:
add_executable(hello ${HelloWorld_SOURCES })

src/main.cpp

int main()
{
  return 0;
}
51
Chris Covert

Essayez de changer

PROJECT(HelloWorld C)

dans

PROJECT(HelloWorld C CXX)

ou juste

PROJECT(HelloWorld)

Voir: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:project

28
olovb

J'ai aussi l'erreur que vous mentionnez:

CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".

Dans mon cas, cela était dû au fait que les fichiers C++ avaient l'extension .cc.

Si CMake est incapable de déterminer correctement la langue du code, vous pouvez utiliser les éléments suivants:

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:

Vous pouvez éventuellement spécifier les langues prises en charge par votre projet . Les exemples de langage sont CXX (c.-à-d. 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ésactivez la vérification en listant explicitement les langues de votre choix soutenir, par exemple C. En utilisant la langue spéciale "NONE" toutes les vérifications pour n'importe quelle langue peut être désactivé. S'il existe une variable appelée CMAKE_PROJECT__INCLUDE_FILE, le fichier pointé par celui-ci La variable sera incluse à la dernière étape de la commande du projet.

109
Joakim

Dans mon cas, c'était simplement parce qu'il n'y avait pas de fichier source dans la cible. Toute ma bibliothèque était un modèle avec un code source dans l'en-tête. L’ajout d’un fichier.cpp vide a résolu le problème.

38
Moebius

Aussi déroutant soit-il, 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 tapez par erreur un nom de fichier, vous obtenez cette erreur.

6
Jolly Roger

J'ai également fait face à une erreur similaire lors de la compilation de mon code basé sur C. J'ai résolu le problème en corrigeant le chemin du fichier source dans mon fichier cmake. Veuillez vérifier le chemin du fichier source de chaque fichier source mentionné dans votre fichier cmake. Cela pourrait vous aider aussi.

2
user2999709

Par défaut, le dossier JNI Native est nommé jni . Le renommer en cpp corrige le problème

0
HimalayanCoder

Réponse un peu sans rapport avec OP mais pour des gens comme moi avec un problème un peu similaire.

Cas d'utilisation: Ubuntu (C, Clion, complétion automatique):

J'ai eu la même erreur,

Erreur CMake: Impossible de déterminer la langue du lien pour la cible "hello".

set_target_properties(hello PROPERTIES LINKER_LANGUAGE C) help corrige ce problème, mais les en-têtes ne sont pas inclus dans le projet et l'auto-complétion ne fonctionnera pas.

C'est ce que j'avais

cmake_minimum_required(VERSION 3.5)

project(hello)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES ./)

add_executable(hello ${SOURCE_FILES})

set_target_properties(hello PROPERTIES LINKER_LANGUAGE C)

Aucune erreur, mais pas ce dont j'avais besoin, j'ai compris qu'un seul fichier en tant que source m'obtiendrait en complétant automatiquement l'auto-complétion et en définissant le lieur sur C.

cmake_minimum_required(VERSION 3.5)

project(hello)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES ./1_helloworld.c)

add_executable(hello ${SOURCE_FILES})
0
fayz

J'ai réussi à résoudre le mien, en changeant 

add_executable (fichier1.cpp)

à 

add_executable (ProjectName file1.cpp)

0
AKJ