Saya mencoba menjalankan program cmake hello world pada Windows 7 x64 dengan Visual Studio 2010 dan Cygwin, tetapi sepertinya tidak bisa keduanya bekerja. Struktur direktori saya adalah sebagai berikut:
HelloWorld
-- CMakeLists.txt
-- src/
-- -- CMakeLists.txt
-- -- main.cpp
-- build/
Saya melakukan cd build
diikuti dengan a cmake ..
, dan mendapatkan kesalahan yang menyatakan itu
CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".
Namun, jika saya mengubah ekstensi main.cpp menjadi main.c baik di filsystem saya dan src/CMakeLists.txt
semuanya berfungsi seperti yang diharapkan. Ini adalah kasus yang berjalan dari Visual Studio Command Prompt (Visual Studio Solution Generator) dan Cygwin Terminal (Unix Makefiles Generator).
Tahu mengapa kode ini tidak berfungsi?
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;
}
Jawaban:
Coba ubah
PROJECT(HelloWorld C)
ke
PROJECT(HelloWorld C CXX)
atau hanya
PROJECT(HelloWorld)
Lihat: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:project
sumber
Saya juga mendapat kesalahan yang Anda sebutkan:
CMake Error: CMake can not determine linker language for target:helloworld CMake Error: Cannot determine link language for target "helloworld".
Dalam kasus saya ini karena memiliki file C ++ dengan
.cc
ekstensi.Jika CMake tidak dapat menentukan bahasa kode dengan benar, Anda dapat menggunakan yang berikut ini:
set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)
Jawaban yang diterima yang menyarankan untuk menambahkan bahasa ke
project()
pernyataan hanya menambahkan pemeriksaan yang lebih ketat untuk bahasa apa yang digunakan (menurut dokumentasi), tetapi itu tidak membantu saya:sumber
Dalam kasus saya, itu hanya karena tidak ada file sumber di target. Semua perpustakaan saya adalah template dengan kode sumber di header. Menambahkan file kosong.cpp memecahkan masalah.
sumber
src
subdirektori masing-masing daricmake
proyek yang baru saya buat (perpustakaan bersama) dan ini pada dasarnya adalah penyebab dari seluruh masalah. Dalam kasus seperti itu, seseorang benar-benar menghargai memiliki wizard untuk menjaga strukturcmake
proyek Anda . : D#include
untuk setiap file. Meskipun tidak akan ada keluaran saat perpustakaan Anda dikompilasi, itu akan melakukan pemeriksaan sintaks file Anda, dan juga memeriksa dependensi header (misalnya header sistem) yang mungkin Anda lewatkan.Meskipun membingungkan, kesalahan juga terjadi ketika file cpp yang disertakan dalam proyek tidak ada.
Jika Anda mendaftarkan file sumber Anda di CMakeLists.txt dan salah mengetik nama file maka Anda mendapatkan kesalahan ini.
sumber
Jawaban yang agak tidak terkait dengan OP tetapi untuk orang seperti saya dengan masalah yang agak mirip.
Kasus Penggunaan: Ubuntu (C, Clion, Penyelesaian Otomatis):
Saya mengalami kesalahan yang sama,
set_target_properties(hello PROPERTIES LINKER_LANGUAGE C)
membantu memperbaiki masalah itu tetapi header tidak disertakan ke proyek dan pelengkapan otomatis tidak akan berfungsi.Inilah yang saya miliki
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)
Tidak ada kesalahan tetapi bukan yang saya butuhkan, saya menyadari bahwa memasukkan satu file sebagai sumber akan membuat saya pelengkapan otomatis serta akan mengatur linker ke
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})
sumber
I also faced a similar error while compiling my C-based code. I fixed the issue by correcting the source file path in my
cmake
file. Please check the source file path of each source file mentioned in yourcmake
file. This might help you too.sumber
I want to add another solution in case a library without any source files shall be build. Such libraries are also known as header only libraries. By default
add_library
expects at least one source file added or otherwise the mentioned error occurs. Since header only libraries are quite common, cmake has theINTERFACE
keyword to build such libraries. TheINTERFACE
keyword is used as shown below and it eliminates the need for empty source files added to the library.add_library(myLibrary INTERFACE) target_include_directories(myLibrary INTERFACE {CMAKE_CURRENT_SOURCE_DIR})
The example above would build a header only library including all header files in the same directory as the CMakeLists.txt. Replace
{CMAKE_CURRENT_SOURCE_DIR}
with a path in case your header files are in a different directory than the CMakeLists.txt file.Have a look at this blog post or the cmake documentation for further info regarding header only libraries and cmake.
sumber
By default the JNI Native folder is named as jni . Renaming it to cpp fixed the issue
sumber
I managed to solve mine, by changing
add_executable(file1.cpp)
to
add_executable(ProjectName file1.cpp)
sumber
In my case, implementing a member function of a class in a header file cause this error. Separating interface (in x.h file) and implementation (in x.cpp file) solves the problem.
sumber