CMake가 C ++로 링커 언어를 결정할 수 없습니다.


89

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

"[...] main.cpp의 확장자를 변경하면 [...]"무엇으로 변경합니까? .cc?
JAB

죄송합니다. 우연히 놔뒀어요 나는 그것을 '.c'로 변경합니다. 원본 게시물에서 수정되었습니다. cpp 컴파일러 나 그런 종류의 컴파일러가 없다고 거의 생각하게 만들지 만, g ++는 욕심 내고 Visual Studio는 C ++에도 문제가 없어야합니다.
Chris Covert

답변:



182

또한 언급 한 오류가 있습니다.

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이라는 변수가 존재하면 해당 변수가 가리키는 파일이 프로젝트 명령의 마지막 단계로 포함됩니다.


제 경우에는 파일 확장자가 .hpp였습니다. 이것은 해결되었습니다!
brawner

나에게도 .hpp 파일이 있으며 이로 인해 수정되었습니다.
KulaGGin

68

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


6
set target properties는 no cpp 파일 문제에도 적용됩니다.
Denise Skidmore

1
팁에 대한 명성. 나는 또한 내 소스를 각각의src 새로 만든 cmake프로젝트 (공유 라이브러리) 하위 디렉토리 으며 이것이 기본적으로 전체 문제의 원인이었습니다. 그러한 경우에는 cmake프로젝트 의 구조를 처리하는 마법사가 있다는 사실에 감사드립니다 . : D
rbaleksandar

여기에도 같은 이유가 있습니다 (복사-붙여 넣기 실수). 감사!
Vivit 16.10.28

2
유용한 팁. "라이브러리"가 헤더 전용 인 경우에도 하나의 .cpp 파일을 만들어야합니다.#include 각 파일에 대해 를 합니다. 라이브러리가 컴파일 될 때 출력이 없더라도 파일의 구문 검사를 수행하고 놓친 헤더 종속성 (예 : 시스템 헤더)도 확인합니다.
Mark Lakata

그렇게 간단합니다. 경로에 오타를 입력하면 소스에 * .cpp 파일이 없습니다. 그 후에는 괜찮습니다. 감사합니다!
Rahul Das

17

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

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


댓글 섹션에서와 같이 만드십시오.
Virb

1
이것은 다른 답변이 말한 것과 독립적이므로 자체 답변으로 작동합니다. 또한 이것은 내 문제를 해결했습니다.
Czarking

5

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

CXX_FLAGS를 사용하여 C ++ 표준 버전을 설정하고 CXX_STANDARD 변수를 언급하겠다고 생각했습니다. cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html 권장되는 방법이라고 생각 합니다. cmake 3.5에서 사용 가능
Chris Covert

2

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


0

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


0

소스 파일이없는 라이브러리를 빌드 할 경우 다른 솔루션을 추가하고 싶습니다. 이러한 라이브러리는 헤더 전용 라이브러리 라고도 합니다. 기본적 add_library으로 최소한 하나의 소스 파일이 추가되어야하며 그렇지 않으면 언급 된 오류가 발생합니다. 헤더 전용 라이브러리는 매우 일반적이므로 cmake에는 INTERFACE이러한 라이브러리를 빌드 하는 키워드가 있습니다. INTERFACE아래와 같이 키워드를 사용하고,이 라이브러리에 추가 빈 소스 파일에 대한 필요가 없습니다.

add_library(myLibrary INTERFACE)
target_include_directories(myLibrary INTERFACE {CMAKE_CURRENT_SOURCE_DIR})

위의 예는 CMakeLists.txt와 동일한 디렉토리에있는 모든 헤더 파일을 포함하는 헤더 전용 라이브러리를 빌드합니다. {CMAKE_CURRENT_SOURCE_DIR}헤더 파일이 CMakeLists.txt 파일과 다른 디렉토리에있는 경우 경로로 바꿉니다 .

헤더 전용 라이브러리 및 cmake에 대한 자세한 정보 는이 블로그 게시물 또는 cmake 문서 를 참조하십시오.


-2

나는 변화를 통해 나의 것을 해결할 수 있었다.

add_executable(file1.cpp)

...에

add_executable(ProjectName file1.cpp)

-2

제 경우에는 헤더 파일에서 클래스의 멤버 함수를 구현하면이 오류가 발생합니다. 인터페이스 (xh 파일)와 구현 (x.cpp 파일)을 분리하면 문제가 해결됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.