CMake ไม่สามารถระบุภาษาตัวเชื่อมโยงด้วย C ++


90

ฉันพยายามเรียกใช้โปรแกรม cmake hello world บน Windows 7 x64 กับทั้ง Visual Studio 2010 และ Cygwin แต่ดูเหมือนจะไม่สามารถใช้งานได้ โครงสร้างไดเร็กทอรีของฉันมีดังนี้:

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

ฉันทำcd buildตามด้วย a 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 Command Prompt (Visual Studio Solution Generator) และ Cygwin Terminal (Unix Makefiles 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)

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

"[... ] if I change the extension of main.cpp [... ]" คุณเปลี่ยนเป็นอะไร? .cc?
JAB

โอ๊ะโอ ทิ้งไว้โดยบังเอิญ ฉันเปลี่ยนเป็น ".c" แก้ไขในโพสต์เดิม เกือบจะทำให้ฉันคิดว่าไม่มีคอมไพเลอร์ cpp หรือบางอย่างในการจัดเรียง แต่ g ++ นั้นติดตั้งและวิชวลสตูดิโอไม่ควรมีปัญหากับ c ++ เช่นกัน
Chris Covert

คำตอบ:


41

ลองเปลี่ยน

PROJECT(HelloWorld C)

เป็น

PROJECT(HelloWorld C CXX)

หรือเพียงแค่

PROJECT(HelloWorld)

ดู: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:project


13
สิ่งนี้ไม่เป็นประโยชน์สำหรับฉัน ข้อผิดพลาดตัวเชื่อมโยงยังคงอยู่ดูคำตอบของฉันสิ่งที่ช่วยแก้ไขได้
Joakim

184

ฉันยังได้รับข้อผิดพลาดที่คุณพูดถึง:

CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".

ในกรณีของฉันนี่เป็นเพราะมีไฟล์ C ++ ที่มี.ccนามสกุล

หาก 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

71

ในกรณีของฉันเป็นเพียงเพราะไม่มีซอร์สไฟล์ในเป้าหมาย ห้องสมุดทั้งหมดของฉันเป็นเทมเพลตที่มีซอร์สโค้ดในส่วนหัว การเพิ่ม file.cpp ว่างเปล่าช่วยแก้ปัญหาได้


6
การตั้งค่าคุณสมบัติเป้าหมายยังใช้ได้กับปัญหาไม่มีไฟล์ cpp
Denise Skidmore

1
ความรุ่งโรจน์สำหรับเคล็ดลับ ฉันยังลืมที่จะย้ายแหล่งที่มาของฉันไปยังsrcไดเรกทอรีย่อยที่เกี่ยวข้องของcmakeโครงการที่สร้างขึ้นใหม่ของฉัน(ไลบรารีที่ใช้ร่วมกัน) และนี่เป็นสาเหตุของปัญหาทั้งหมด ในกรณีเช่นนี้เรารู้สึกขอบคุณที่มีตัวช่วยในการดูแลโครงสร้างของcmakeโครงการของคุณ : D
rbaleksandar

เหตุผลเดียวกันที่นี่ (คัดลอกวางผิดพลาด) ขอบคุณ!
Vivit

2
เคล็ดลับที่เป็นประโยชน์ แม้ว่า "ไลบรารี" ของคุณจะเป็นเฉพาะส่วนหัว แต่คุณควรสร้างไฟล์. cpp ขึ้นมาหนึ่งไฟล์#includeสำหรับแต่ละไฟล์ แม้ว่าจะไม่มีเอาต์พุตเมื่อคอมไพล์ไลบรารีของคุณ แต่ก็จะทำการตรวจสอบไวยากรณ์ของไฟล์ของคุณและตรวจสอบการอ้างอิงส่วนหัว (เช่นส่วนหัวของระบบ) ที่คุณอาจพลาดไป
Mark Lakata

มันเป็นเรื่องง่ายเหมือนที่. การพิมพ์ผิดในเส้นทางทำให้ไม่มีไฟล์ * .cpp ในแหล่งที่มา หลังจากนั้นทั้งหมดก็ดี ขอขอบคุณ!
Rahul Das

17

อาจทำให้เกิดความสับสนข้อผิดพลาดยังเกิดขึ้นเมื่อไม่มีไฟล์ cpp ที่รวมอยู่ในโปรเจ็กต์

หากคุณแสดงรายการไฟล์ต้นฉบับของคุณใน CMakeLists.txt และพิมพ์ชื่อไฟล์ผิดพลาดคุณจะได้รับข้อผิดพลาดนี้


กรุณาทำให้เป็นในส่วนความคิดเห็น
Virb

1
สิ่งนี้ใช้เป็นคำตอบของตัวเองเนื่องจากไม่ขึ้นอยู่กับคำตอบอื่น ๆ สิ่งนี้ช่วยแก้ปัญหาของฉันด้วย
Czarking

5

คำตอบที่ไม่เกี่ยวกับ OP แต่สำหรับคนอย่างฉันที่มีปัญหาค่อนข้างคล้ายกัน

ใช้กรณี: 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})

เพิ่งสังเกตว่าคุณใช้ CXX_FLAGS เพื่อตั้งค่าเวอร์ชันมาตรฐาน C ++ และคิดว่าฉันจะพูดถึงตัวแปร CXX_STANDARD ซึ่งฉันคิดว่าเป็นวิธีที่แนะนำ cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.htmlและควรเป็น มีให้ใน cmake 3.5
Chris Covert

2

ฉันยังประสบกับข้อผิดพลาดที่คล้ายกันขณะรวบรวมรหัสที่ใช้ C ของฉัน ฉันแก้ไขปัญหาโดยการแก้ไขเส้นทางไฟล์ต้นฉบับในcmakeไฟล์ของฉัน โปรดตรวจสอบเส้นทางไฟล์ต้นฉบับของไฟล์ต้นฉบับแต่ละไฟล์ที่กล่าวถึงในcmakeไฟล์ของคุณ สิ่งนี้อาจช่วยคุณได้เช่นกัน


1

ฉันต้องการเพิ่มโซลูชันอื่นในกรณีที่มีการสร้างไลบรารีที่ไม่มีไฟล์ต้นฉบับ ไลบรารีดังกล่าวเรียกอีกอย่างว่าไลบรารีส่วนหัวเท่านั้น โดยค่าเริ่มต้น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


0

โดยค่าเริ่มต้นโฟลเดอร์ JNI พื้นเมืองมีชื่อเป็นJNI เปลี่ยนชื่อเป็นcppช่วยแก้ปัญหาได้


-2

ฉันจัดการเพื่อแก้ปัญหาของฉันโดยการเปลี่ยน

add_executable(file1.cpp)

ถึง

add_executable(ProjectName file1.cpp)

-2

ในกรณีของฉันการใช้ฟังก์ชันสมาชิกของคลาสในไฟล์ส่วนหัวทำให้เกิดข้อผิดพลาดนี้ การแยกอินเทอร์เฟซ (ในไฟล์ xh) และการใช้งาน (ในไฟล์ x.cpp) ช่วยแก้ปัญหาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.