Ich versuche, ein cmake-Hallo-Welt-Programm unter Windows 7 x64 sowohl mit Visual Studio 2010 als auch mit Cygwin auszuführen, kann aber anscheinend nicht zur Arbeit kommen. Meine Verzeichnisstruktur sieht wie folgt aus:
HelloWorld
-- CMakeLists.txt
-- src/
-- -- CMakeLists.txt
-- -- main.cpp
-- build/
Ich mache einen cd build
, gefolgt von einem cmake ..
, und erhalte eine Fehlermeldung
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 auf meinem Dateisystem und in src/CMakeLists.txt
ändere, funktioniert alles wie erwartet. Dies ist der Fall, der sowohl von der Visual Studio-Eingabeaufforderung (Visual Studio Solution Generator) als auch vom 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;
}
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
Ich habe auch den Fehler, 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 war dies auf C++ - Dateien mit der Erweiterung .cc
zurückzuführen.
Wenn CMake die Sprache des Codes nicht richtig ermitteln kann, können Sie Folgendes verwenden:
set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)
Die akzeptierte Antwort, die das Anhängen der Sprache an die project()
-Anweisung vorschlägt, fügt einfach eine strengere Prüfung der verwendeten Sprache hinzu (laut Dokumentation), war mir aber nicht hilfreich:
Optional können Sie angeben, welche Sprachen Ihr Projekt unterstützt . Beispielsprachen sind CXX (d. H. C++), C, Fortran usw. Standardmäßig ist C und CXX sind aktiviert. Z.B. Wenn Sie keinen C++ - Compiler haben, können Sie Deaktivieren Sie die Überprüfung dafür, indem Sie die gewünschten Sprachen explizit auflisten unterstützen, z. C. Mit der speziellen Sprache "NONE" werden alle Prüfungen für jede Sprache kann deaktiviert werden. Wenn eine Variable existiert, heißt CMAKE_PROJECT__INCLUDE_FILE, die Datei, auf die .__ verweist. Variable wird als letzter Schritt des Projektbefehls eingefügt.
In meinem Fall lag es einfach daran, dass sich im Ziel keine Quelldatei befand. Alle meine Bibliothek war Vorlage mit Quellcode in der Kopfzeile. Durch das Hinzufügen einer leeren Datei.cpp wurde das Problem behoben.
So verwirrend es auch sein mag, der Fehler tritt auch auf, wenn keine im Projekt enthaltene CPP-Datei vorhanden ist.
Wenn Sie Ihre Quelldateien in CMakeLists.txt auflisten und versehentlich einen Dateinamen eingeben, wird dieser Fehler angezeigt.
Beim Kompilieren meines C-basierten Codes ist ein ähnlicher Fehler aufgetreten. Ich habe das Problem behoben, indem ich den Quelldateipfad in meiner cmake
-Datei korrigiert habe. Bitte überprüfen Sie den Quelldateipfad jeder in Ihrer cmake
-Datei angegebenen Quelldatei. Das könnte dir auch helfen.
Standardmäßig wird der Ordner "JNI Native" als jni bezeichnet. Umbenennen in cpp Problem behoben
Eine etwas unabhängige Antwort auf OP, aber für Leute wie mich mit einem etwas ähnlichen Problem.
Anwendungsfall: Ubuntu (C, Clion, Auto-Vervollständigung):
Ich hatte den gleichen Fehler,
CMake-Fehler: Linksprache für Ziel "Hallo" kann nicht ermittelt werden.
set_target_properties(hello PROPERTIES LINKER_LANGUAGE C)
help behebt das 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. Wenn ich eine einzelne Datei als Quelle hinzufüge, bekomme ich eine automatische Vervollständigung und der Linker wird auf C
gesetzt.
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})
Es gelang mir, meine zu lösen, indem ich mich veränderte
add_executable (file1.cpp)
zu
add_executable (Projektname file1.cpp)