Ответ 1
Попробуйте изменить
PROJECT(HelloWorld C)
в
PROJECT(HelloWorld C CXX)
или просто
PROJECT(HelloWorld)
Смотрите: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:project
Я пытаюсь запустить глобальную программу cmake hello на Windows 7 x64 с Visual Studio 2010 и Cygwin, но, похоже, не может работать. Моя структура каталогов выглядит следующим образом:
HelloWorld
-- CMakeLists.txt
-- src/
-- -- CMakeLists.txt
-- -- main.cpp
-- build/
Я делаю a cd build
, а затем cmake ..
, и получаю сообщение об ошибке
CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".
Однако, если я изменю расширение main.cpp на main.c как на моей файловой системе, так и в src/CMakeLists.txt
, все работает так, как ожидалось. Это происходит как из командной строки Visual Studio (Visual Studio Solution Generator), так и из Cygwin Terminal (Unix Makefile Generator).
Любая идея, почему этот код не работает?
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)
ЦСИ/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 })
ЦСИ/main.cpp
int main()
{
return 0;
}
Попробуйте изменить
PROJECT(HelloWorld C)
в
PROJECT(HelloWorld C CXX)
или просто
PROJECT(HelloWorld)
Смотрите: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:project
Я также получил сообщение об ошибке:
CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".
В моем случае это было связано с наличием файлов С++ с расширением .cc
.
Если CMake не может правильно определить язык кода, вы можете использовать следующее:
set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)
Принятый ответ, предполагающий добавление языка в оператор project()
, просто добавляет более строгую проверку того, какой язык используется (согласно документации), но мне это не помогло:
По желанию вы можете указать языки, поддерживаемые вашим проектом. Например, языки CXX (например, С++), C, Fortran и т.д. По умолчанию C и CXX включены. Например. если у вас нет компилятора С++, вы можете отключите проверку, явно указав нужные вам языки. для поддержки, например. C. Используя специальный язык "NONE", все проверки для любого языка может быть отключен. Если существует переменная, называемая CMAKE_PROJECT__INCLUDE_FILE, файл, на который указывает этот файл переменная будет включена в качестве последнего шага команды проекта.
В моем случае это было просто потому, что в целевом файле не было исходного файла. Вся моя библиотека была шаблоном с исходным кодом в заголовке. Добавление пустой file.cpp решило проблему.
Как ни странно, ошибка возникает и в том случае, если файл cpp, включенный в проект, не существует.
Если вы перечислите свои исходные файлы в CMakeLists.txt и по ошибке введете имя файла, вы получите эту ошибку.
Я также столкнулся с подобной ошибкой при компиляции моего кода на основе Си. Я исправил проблему, исправив путь к исходному файлу в моем файле cmake
. Пожалуйста, проверьте путь к исходному файлу для каждого исходного файла, указанного в вашем файле cmake
. Это может помочь вам тоже.
По умолчанию собственная папка JNI называется jni. Переименование в cpp решило проблему
Немного не связанный ответ на ОП, но для людей вроде меня с несколько похожей проблемой.
Вариант использования: Ubuntu (C, Clion, автозаполнение):
У меня была такая же ошибка,
CMake Ошибка: невозможно определить язык ссылок для цели "привет".
set_target_properties(hello PROPERTIES LINKER_LANGUAGE C)
поможет решить эту проблему, но заголовки не включены в проект, и автозаполнение не будет работать.
Это то, что у меня было
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)
Нет ошибок, но не то, что мне было нужно, я понял, что включение одного файла в качестве источника приведет к автозаполнению, а также к компоновщику 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})
Мне удалось решить мой, изменив
add_executable(file1.cpp)
отдо
add_executable(ProjectName file1.cpp)
В моем случае, реализация функции-члена класса в заголовочном файле вызывает эту ошибку. Разделение интерфейса (в файле x.h) и реализации (в файле x.cpp) решает проблему.