Подтвердить что ты не робот

CMake не может определить язык компоновщика с С++

Я пытаюсь запустить глобальную программу 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;
}
4b9b3361

Ответ 2

Я также получил сообщение об ошибке:

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, файл, на который указывает этот файл переменная будет включена в качестве последнего шага команды проекта.

Ответ 3

В моем случае это было просто потому, что в целевом файле не было исходного файла. Вся моя библиотека была шаблоном с исходным кодом в заголовке. Добавление пустой file.cpp решило проблему.

Ответ 4

Как ни странно, ошибка возникает и в том случае, если файл cpp, включенный в проект, не существует.

Если вы перечислите свои исходные файлы в CMakeLists.txt и по ошибке введете имя файла, вы получите эту ошибку.

Ответ 5

Я также столкнулся с подобной ошибкой при компиляции моего кода на основе Си. Я исправил проблему, исправив путь к исходному файлу в моем файле cmake. Пожалуйста, проверьте путь к исходному файлу для каждого исходного файла, указанного в вашем файле cmake. Это может помочь вам тоже.

Ответ 6

По умолчанию собственная папка JNI называется jni. Переименование в cpp решило проблему

Ответ 7

Немного не связанный ответ на ОП, но для людей вроде меня с несколько похожей проблемой.

Вариант использования: 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})

Ответ 8

Мне удалось решить мой, изменив

add_executable(file1.cpp)
от

до

add_executable(ProjectName file1.cpp)

Ответ 9

В моем случае, реализация функции-члена класса в заголовочном файле вызывает эту ошибку. Разделение интерфейса (в файле x.h) и реализации (в файле x.cpp) решает проблему.