सीके + सी + के साथ लिंकर भाषा निर्धारित करने में असमर्थ


91

मैं विंडोज 7 x64 पर विजुअल स्टूडियो 2010 और साइगविन दोनों के साथ एक cmake हैलो वर्ल्ड प्रोग्राम चलाने का प्रयास कर रहा हूं, लेकिन काम करने के लिए नहीं मिल सकता है। मेरी निर्देशिका संरचना इस प्रकार है:

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".

हालांकि, अगर मैं अपने filsystem पर और src/CMakeLists.txtअपेक्षित रूप से काम करता है , तो main.cpp के विस्तार को main.c में बदल देता हूं । यह विजुअल स्टूडियो कमांड प्रॉम्प्ट (विजुअल स्टूडियो सॉल्यूशन जेनरेटर) और सिगविन टर्मिनल (यूनिक्स मेकफेयर जेनरेटर) दोनों से चल रहा है।

किसी भी विचार क्यों यह कोड काम नहीं करेगा?

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 संकलक या सॉर्ट का कुछ नहीं है, लेकिन जी ++ है और दृश्य स्टूडियो c ++ के साथ समस्या नहीं होनी चाहिए या तो है।
क्रिस गुप्त

जवाबों:


41

बदलने की कोशिश करें

PROJECT(HelloWorld C)

जांच

PROJECT(HelloWorld C CXX)

या केवल

PROJECT(HelloWorld)

देखें: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:project


13
यह मेरे लिए मददगार नहीं था। लिंकर त्रुटि बनी रही, मेरा उत्तर देखें कि इसे ठीक करने में क्या मदद मिली।
जोकिम

185

मुझे आपके द्वारा उल्लिखित त्रुटि भी मिली:

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

मेरे मामले में यह .ccएक्सटेंशन के साथ C ++ फ़ाइलें होने के कारण था ।

यदि सीएमके कोड की भाषा को सही ढंग से निर्धारित करने में असमर्थ है, तो आप निम्नलिखित का उपयोग कर सकते हैं:

set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)

स्वीकृत उत्तर जो भाषा को project()कथन के लिए लागू करने का सुझाव देता है, बस भाषा के उपयोग के लिए और अधिक सख्त जाँच जोड़ता है (प्रलेखन के अनुसार), लेकिन यह मेरे लिए उपयोगी नहीं था:

वैकल्पिक रूप से आप निर्दिष्ट कर सकते हैं कि आपकी परियोजना किन भाषाओं का समर्थन करती है। उदाहरण भाषाएं CXX (यानी C ++), C, फोरट्रान आदि हैं। डिफ़ॉल्ट रूप से C और CXX सक्षम हैं। उदाहरण के लिए, यदि आपके पास C ++ कंपाइलर नहीं है, तो आप इसके लिए चेक को स्पष्ट रूप से उन भाषाओं को सूचीबद्ध करने के लिए अक्षम कर सकते हैं जिन्हें आप समर्थन करना चाहते हैं, उदाहरण के लिए C. विशेष भाषा "NONE" का उपयोग करके किसी भी भाषा के लिए सभी चेक अक्षम किए जा सकते हैं। यदि कोई चर CMAKE_PROJECT__INCLUDE_FILE नामक मौजूद है, तो उस चर द्वारा इंगित की गई फ़ाइल को प्रोजेक्ट कमांड के अंतिम चरण के रूप में शामिल किया जाएगा।


मेरे मामले में, मेरी फ़ाइल में .hpp एक्सटेंशन था। यह हल हो गया!
ब्रावनर

मेरे लिए वही .hpp फ़ाइल और इसने इसे ठीक किया।
कुलागिन

71

मेरे मामले में, यह सिर्फ इसलिए था क्योंकि लक्ष्य में कोई स्रोत फ़ाइल नहीं थी। हेडर में स्रोत कोड के साथ मेरी सभी लाइब्रेरी टेम्पलेट थी। एक खाली file.cpp को जोड़ने से समस्या हल हो गई।


6
सेट लक्ष्य गुण भी cpp फ़ाइल समस्या के लिए काम करता है।
डेनिस स्किडमोर

1
टिप के लिए यश। मैं अपने स्रोतों को srcअपने नए बनाए गए cmakeप्रोजेक्ट (एक साझा पुस्तकालय) के संबंधित उपनिर्देशिका में स्थानांतरित करना भी नहीं भूला और यह मूल रूप से पूरी समस्या का कारण था। ऐसे मामलों में कोई वास्तव में आपके cmakeप्रोजेक्ट की संरचना का ध्यान रखने के लिए एक जादूगर की सराहना करता है । : D
rbaleksandar

एक ही कारण यहाँ (कॉपी-पेस्ट गलती)। धन्यवाद!
विविट

2
उपयोगी टिप। यहां तक ​​कि अगर आपकी "लाइब्रेरी" केवल हेडर है, तो आपको #includeप्रत्येक फ़ाइल के लिए एक .cpp फ़ाइल बनाना चाहिए । भले ही आपकी लाइब्रेरी संकलित होने पर कोई आउटपुट नहीं होगा, यह आपकी फ़ाइल की वाक्यविन्यास जाँच करेगा, और हेडर निर्भरता (उदाहरण के लिए सिस्टम हेडर) के लिए भी जाँच करेगा जिसे आपने याद किया होगा।
निशान लता

यह बहुत ही सरल है। पथ में टाइपो नं। * .Cpp फ़ाइलों को स्रोतों में ले जाता है। उसके बाद सब ठीक। धन्यवाद!
राहुल दास

17

जैसा भी हो, भ्रमित करना, त्रुटि तब भी होती है जब परियोजना में शामिल एक cpp फ़ाइल मौजूद नहीं होती है।

यदि आप CMakeLists.txt में अपनी स्रोत फ़ाइलों को सूचीबद्ध करते हैं और गलती से एक फ़ाइल नाम टाइप करते हैं तो आपको यह त्रुटि मिलती है।


कृपया इसे टिप्पणी अनुभाग में बनाएं।
वीरबल

1
यह अपने स्वयं के उत्तर के रूप में काम करता है क्योंकि यह स्वतंत्र है कि अन्य उत्तर क्या कहते हैं। इसके अलावा इसने मेरा मुद्दा तय कर दिया।
ज़र्क

5

ओपी के लिए थोड़ा असंबंधित उत्तर लेकिन मेरे जैसे लोगों के लिए कुछ हद तक समान समस्या के साथ।

केस का उपयोग करें: उबंटू (सी, क्लेयन, ऑटो-पूरा):

मेरे पास एक ही त्रुटि थी,

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)

कोई त्रुटि नहीं है, लेकिन मैं क्या जरूरत है, मुझे एहसास हुआ कि स्रोत के रूप में एक एकल फ़ाइल सहित मुझे autocompletion मिल जाएगा और साथ ही यह करने के लिए लिंकर सेट होगा 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_gt/CXX_STANDARD.html और होना चाहिए 3.5 सेमी में उपलब्ध
क्रिस गुप्त

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 नाम दिया गया है । करने के लिए इसका नाम सीपीपी समस्या का समाधान हो


-2

मैं बदलकर, मेरा समाधान करने में कामयाब रहा

add_executable(file1.cpp)

सेवा

add_executable(ProjectName file1.cpp)

-2

मेरे मामले में, हेडर फ़ाइल में किसी वर्ग के सदस्य फ़ंक्शन को लागू करने से यह त्रुटि होती है। अलग इंटरफ़ेस (xh फ़ाइल में) और कार्यान्वयन (x.cpp फ़ाइल में) समस्या हल करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.