Ich versuche, ein cmake hello world-Programm unter Windows 7 x64 mit Visual Studio 2010 und Cygwin auszuführen, kann aber anscheinend auch nicht funktionieren. Meine Verzeichnisstruktur ist wie folgt:
HelloWorld
-- CMakeLists.txt
-- src/
-- -- CMakeLists.txt
-- -- main.cpp
-- build/
Ich mache ein cd build
gefolgt von einem cmake ..
und bekomme eine Fehlermeldung, die das besagt
CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".
Wenn ich jedoch die Erweiterung von main.cpp in main.c ändere, funktioniert sowohl auf meinem Dateisystem als auch in src/CMakeLists.txt
allem wie erwartet. Dies ist der Fall, der sowohl über die Visual Studio-Eingabeaufforderung (Visual Studio Solution Generator) als auch über das Cygwin-Terminal (Unix Makefiles Generator) ausgeführt wird.
Irgendeine Idee, warum dieser Code nicht funktionieren würde?
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;
}
Antworten:
Versuchen Sie es zu ändern
PROJECT(HelloWorld C)
in
PROJECT(HelloWorld C CXX)
oder nur
PROJECT(HelloWorld)
Siehe: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:project
quelle
Ich habe auch den Fehler bekommen, den Sie erwähnen:
CMake Error: CMake can not determine linker language for target:helloworld CMake Error: Cannot determine link language for target "helloworld".
In meinem Fall lag dies daran, dass C ++ - Dateien mit der
.cc
Erweiterung vorhanden waren.Wenn CMake die Sprache des Codes nicht korrekt bestimmen kann, können Sie Folgendes verwenden:
set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)
Die akzeptierte Antwort, die vorschlägt, die Sprache an die
project()
Anweisung anzuhängen, fügt lediglich eine strengere Überprüfung der verwendeten Sprache hinzu (gemäß der Dokumentation), war jedoch für mich nicht hilfreich:quelle
In meinem Fall lag es nur daran, dass das Ziel keine Quelldatei enthielt. Meine gesamte Bibliothek bestand aus einer Vorlage mit Quellcode im Header. Das Hinzufügen einer leeren Datei.cpp löste das Problem.
quelle
src
Unterverzeichnis meines neu erstelltencmake
Projekts (eine gemeinsam genutzte Bibliothek) zu verschieben, und dies war im Grunde die Ursache für das gesamte Problem. In solchen Fällen weiß man es wirklich zu schätzen, einen Assistenten zu haben, der sich um die Struktur Ihrescmake
Projekts kümmert . : D#include
für jede Datei eine. Auch wenn beim Kompilieren Ihrer Bibliothek keine Ausgabe erfolgt, wird die Syntax Ihrer Datei überprüft und es werden auch Headerabhängigkeiten (z. B. Systemheader) überprüft, die Sie möglicherweise übersehen haben.So verwirrend es auch sein mag, der Fehler tritt auch auf, wenn eine im Projekt enthaltene CPP-Datei nicht vorhanden ist.
Wenn Sie Ihre Quelldateien in CMakeLists.txt auflisten und versehentlich einen Dateinamen eingeben, wird dieser Fehler angezeigt.
quelle
Eine etwas unabhängige Antwort auf OP, aber für Leute wie mich mit einem etwas ähnlichen Problem.
Anwendungsfall: Ubuntu (C, Clion, automatische Vervollständigung):
Ich hatte den gleichen Fehler,
set_target_properties(hello PROPERTIES LINKER_LANGUAGE C)
Hilfe behebt dieses Problem, aber die Header sind nicht im Projekt enthalten und die automatische Vervollständigung funktioniert nicht.Das hatte ich
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)
Keine Fehler, aber nicht das, was ich brauchte. Ich erkannte, dass das Einfügen einer einzelnen Datei als Quelle mir die automatische Vervollständigung ermöglicht und den Linker auf setzt
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})
quelle
Beim Kompilieren meines C-basierten Codes trat auch ein ähnlicher Fehler auf. Ich habe das Problem behoben, indem ich den Quelldateipfad in meiner
cmake
Datei korrigiert habe . Bitte überprüfen Sie den Quelldateipfad jeder in Ihrercmake
Datei genannten Quelldatei . Dies könnte Ihnen auch helfen.quelle
Standardmäßig heißt der native JNI-Ordner jni . Das Umbenennen in cpp hat das Problem behoben
quelle
Ich möchte eine weitere Lösung hinzufügen, falls eine Bibliothek ohne Quelldateien erstellt werden soll. Solche Bibliotheken werden auch als reine Header- Bibliotheken bezeichnet. Standardmäßig wird
add_library
mindestens eine hinzugefügte Quelldatei erwartet, andernfalls tritt der erwähnte Fehler auf. Da nur Header-Bibliotheken weit verbreitet sind, hat cmake dasINTERFACE
Schlüsselwort, um solche Bibliotheken zu erstellen. DasINTERFACE
Schlüsselwort wird wie unten gezeigt verwendet und macht leere Quelldateien, die der Bibliothek hinzugefügt werden, überflüssig.add_library(myLibrary INTERFACE) target_include_directories(myLibrary INTERFACE {CMAKE_CURRENT_SOURCE_DIR})
Im obigen Beispiel wird eine Nur-Header-Bibliothek erstellt, die alle Header-Dateien im selben Verzeichnis wie die Datei CMakeLists.txt enthält. Ersetzen Sie ihn
{CMAKE_CURRENT_SOURCE_DIR}
durch einen Pfad, falls sich Ihre Header-Dateien in einem anderen Verzeichnis als die Datei CMakeLists.txt befinden.Weitere Informationen zu Nur-Header-Bibliotheken und cmake finden Sie in diesem Blog-Beitrag oder in der cmake-Dokumentation .
quelle
Ich habe es geschafft, meine zu lösen, indem ich mich verändert habe
add_executable(file1.cpp)
zu
add_executable(ProjectName file1.cpp)
quelle
In meinem Fall verursacht die Implementierung einer Member-Funktion einer Klasse in einer Header-Datei diesen Fehler. Die Trennung von Schnittstelle (in xh-Datei) und Implementierung (in x.cpp-Datei) löst das Problem.
quelle