CMake가 C ++로 링커 언어를 결정할 수 없습니다. 오류가 발생합니다. CMake

Visual Studio 2010과 Cygwin을 모두 사용하여 Windows 7 x64에서 cmake hello world 프로그램을 실행하려고하는데 둘 다 작동하지 않는 것 같습니다. 내 디렉토리 구조는 다음과 같습니다.

HelloWorld
-- CMakeLists.txt
-- src/
-- -- CMakeLists.txt
-- -- main.cpp
-- build/

나는 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 솔루션 생성기) 및 Cygwin 터미널 (Unix Makefiles 생성기) 모두에서 실행되는 경우입니다.

이 코드가 작동하지 않는 이유를 아십니까?

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;
}


답변

변경 시도

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확장자 가있는 C ++ 파일이 있기 때문 입니다.

CMake가 코드의 언어를 올바르게 결정할 수없는 경우 다음을 사용할 수 있습니다.

set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)

project()문에 언어를 추가하는 것을 제안하는 수락 된 답변 은 문서에 따라 사용되는 언어에 대해 더 엄격한 검사를 추가하지만 나에게 도움이되지 않았습니다.

선택적으로 프로젝트에서 지원하는 언어를 지정할 수 있습니다. 예제 언어는 CXX (예 : C ++), C, Fortran 등입니다. 기본적으로 C 및 CXX가 활성화됩니다. 예를 들어 C ++ 컴파일러가없는 경우 지원하려는 언어 (예 : C)를 명시 적으로 나열하여 검사를 비활성화 할 수 있습니다. 특수 언어 “NONE”을 사용하면 모든 언어에 대한 모든 검사를 비활성화 할 수 있습니다. CMAKE_PROJECT__INCLUDE_FILE이라는 변수가 존재하면 해당 변수가 가리키는 파일이 프로젝트 명령의 마지막 단계로 포함됩니다.


답변

제 경우에는 타겟에 소스 파일이 없기 때문이었습니다. 내 라이브러리는 모두 헤더에 소스 코드가있는 템플릿이었습니다. 빈 file.cpp를 추가하면 문제가 해결되었습니다.


답변

혼란 스러울 수 있지만 프로젝트에 포함 된 cpp 파일이없는 경우에도 오류가 발생합니다.

CMakeLists.txt에 소스 파일을 나열하고 실수로 파일 이름을 입력하면이 오류가 발생합니다.


답변

OP에 대한 약간의 관련없는 대답이지만 다소 비슷한 문제가있는 저와 같은 사람들에게는.

사용 사례 : Ubuntu (C, Clion, 자동 완성) :

나는 같은 오류가 있었다.

CMake 오류 : 대상 “hello”에 대한 링크 언어를 결정할 수 없습니다.

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})

답변

또한 C 기반 코드를 컴파일하는 동안 비슷한 오류가 발생했습니다. 내 cmake파일 의 소스 파일 경로를 수정하여 문제를 해결했습니다 . 파일에 언급 된 각 소스 파일의 소스 파일 경로를 확인 cmake하십시오. 이것은 당신에게도 도움이 될 것입니다.


답변

기본적으로 JNI Native 폴더의 이름은 jni 입니다. cpp로 이름을 바꾸면 문제가 해결되었습니다.