সিএমকে সি ++ এর সাথে লিঙ্কার ভাষা নির্ধারণ করতে অক্ষম


90

আমি ভিজ্যুয়াল স্টুডিও 2010 এবং সাইগউইন উভয় দিয়ে উইন্ডোজ 7 x64 এ একটি চ্যাপ্টা হ্যালো ওয়ার্ল্ড প্রোগ্রাম চালানোর চেষ্টা করছি, তবে কাজটি করতে পারে বলে মনে হচ্ছে না। আমার ডিরেক্টরি কাঠামোটি নিম্নরূপ:

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

যাইহোক, আমি যদি আমার ফাইলসিস্টেম এবং src/CMakeLists.txtসমস্ত কিছুতে মেইন.পি.পি. এর মেইন.সি.কে এক্সটেনশন পরিবর্তন করি তবে প্রত্যাশা অনুযায়ী কাজ করে। এটি ভিজ্যুয়াল স্টুডিও কমান্ড প্রম্পট (ভিজ্যুয়াল স্টুডিও সলিউশন জেনারেটর) এবং সাইগউইন টার্মিনাল (ইউনিক্স মেকফিলস জেনারেটর) উভয় থেকেই চলছে।

কোনও ধারণা কেন এই কোডটি কাজ করবে না?

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

"[...] যদি আমি মেইন.কেপ্পের এক্সটেনশন পরিবর্তন করি [...]" আপনি কী এটিকে পরিবর্তন করবেন? .সি?
জ্যাব

উফ! দুর্ঘটনাক্রমে যে বাকি। আমি এটিকে '.c' এ পরিবর্তন করি। মূল পোস্টে সম্পাদিত। এটি প্রায় আমাকে ভাবায় যে সিপিপি সংকলক বা সাজানোর কিছু নেই, তবে জি ++ ইনসাল্ট করা হয় এবং ভিজ্যুয়াল স্টুডিওতে সি ++ এর সাথে সমস্যা না হওয়া উচিত।
ক্রিস কভার্ট

উত্তর:


41

পরিবর্তনের চেষ্টা করুন

PROJECT(HelloWorld C)

মধ্যে

PROJECT(HelloWorld C CXX)

অথবা শুধুই

PROJECT(HelloWorld)

দেখুন: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command : প্রকল্প


13
এটি আমার পক্ষে সহায়ক ছিল না। লিঙ্কারের ত্রুটিটি রয়ে গেল, আমার উত্তর দেখুন কী এটি ঠিক করতে সহায়তা করেছিল।
জোয়াকিম

184

আপনার উল্লেখ করা ত্রুটিটিও পেয়েছি:

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

আমার ক্ষেত্রে এটি .ccএক্সটেনশন সহ সি ++ ফাইল থাকার কারণে হয়েছিল ।

সিএমকেক কোডের ভাষা সঠিকভাবে নির্ধারণ করতে না পারলে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)

গৃহীত উত্তর যা project()বিবৃতিতে ভাষা সংযোজন করার পরামর্শ দেয় তাতে কোন ভাষাটি ব্যবহৃত হয় (ডকুমেন্টেশন অনুসারে) কেবল আরও কঠোর পরীক্ষার যোগ করে, তবে এটি আমার পক্ষে সহায়ক ছিল না:

আপনার প্রকল্পটি কোন ভাষাগুলি সমর্থন করে তা ptionচ্ছিকভাবে আপনি নির্দিষ্ট করতে পারেন। উদাহরণস্বরূপ ভাষাগুলি হ'ল সিএক্সএক্স (অর্থাত্ সি ++), সি, ফোর্টরান ইত্যাদি default ডিফল্টরূপে সি এবং সিএক্সএক্স সক্ষম হয়। উদাহরণস্বরূপ, যদি আপনার কাছে সি ++ সংকলক না থাকে তবে আপনি যে ভাষাগুলি সমর্থন করতে চান তা স্পষ্ট করে তালিকাভুক্ত করে চেকটি অক্ষম করতে পারেন, উদাহরণস্বরূপ সি। বিশেষ ভাষা "না" ব্যবহার করে যে কোনও ভাষার জন্য সমস্ত চেক অক্ষম করা যায়। যদি কোনও ভেরিয়েবল CMAKE_PROJECT__INCLUDE_FILE নামে উপস্থিত থাকে তবে সেই ভেরিয়েবল দ্বারা নির্দেশিত ফাইলটি প্রকল্প কমান্ডের শেষ ধাপ হিসাবে অন্তর্ভুক্ত করা হবে।


আমার ক্ষেত্রে, আমার ফাইলে একটি .hpp এক্সটেনশন ছিল। এটি সমাধান!
ব্রাভনার

আমার জন্য একই, .hpp ফাইল এবং এটি এটি স্থির করে।
কুলাগিন

71

আমার ক্ষেত্রে এটি লক্ষ্যমাত্রায় কোনও উত্স ফাইল নেই বলেই হয়েছিল। আমার সমস্ত গ্রন্থাগার শিরোনামে সোর্স কোড সহ টেম্পলেট ছিল। একটি খালি file.cpp যুক্ত করা সমস্যার সমাধান করেছে।


6
সেট লক্ষ্য বৈশিষ্ট্যগুলি কোনও সিপিপি ফাইল ইস্যুতেও কাজ করে।
ডেনিস স্কিডমোর

4
টিপস জন্য কুডোস। আমি আমার উত্সগুলি srcআমার সদ্য নির্মিত cmakeপ্রকল্পের (স্বীকৃত লাইব্রেরি) সংশ্লিষ্ট সাব ডাইরেক্টরিতে স্থানান্তরিত করতে ভুলেও যাইনি এবং এটি মূলত পুরো সমস্যার কারণ ছিল। আপনার ক্ষেত্রে আপনার cmakeপ্রকল্পের কাঠামো যত্ন নেওয়ার জন্য একজন উইজার্ড থাকার বিষয়ে সত্যই প্রশংসা করা যায় । : ডি
আরবেলেকসন্দর

এখানে একই কারণ (অনুলিপি-অনুলিপি)। ধন্যবাদ!
28:17

4
দরকারী টিপস। এমনকি যদি আপনার "গ্রন্থাগার" কেবল শিরোনাম হয় তবে আপনার একটি .cpp ফাইল তৈরি করা উচিত যা #includeপ্রতিটি ফাইলের জন্য একটি করে a যদিও আপনার লাইব্রেরিটি সংকলিত হওয়ার পরে কোনও আউটপুট থাকবে না, এটি আপনার ফাইলের সিনট্যাক্স চেক করবে এবং শিরোনাম নির্ভরতা (উদাহরণস্বরূপ সিস্টেমের শিরোনাম) যা আপনি মিস করেছেন তাও পরীক্ষা করবে।
Lakata

এটা যে হিসাবে হিসাবে সহজ। সূত্রগুলিতে কোনও টাইপ * * .cpp ফাইলের দিকে না যায়। তার পরে সব ঠিক আছে। ধন্যবাদ!
রাহুল দাস

17

বিভ্রান্তি যেমন হতে পারে, ত্রুটিটি তখন ঘটে যখন প্রকল্পে অন্তর্ভুক্ত সিপিপি ফাইল উপস্থিত না থাকে।

আপনি যদি নিজের উত্স ফাইলগুলি সিএমকেলিস্ট.টেক্সটে তালিকাভুক্ত করেন এবং ভুল করে কোনও ফাইলের নাম টাইপ করেন তবে আপনি এই ত্রুটিটি পান।


মন্তব্য বিভাগে হিসাবে এটি করুন।
ভার্বব

4
অন্যান্য উত্তরগুলি যা বলেছিল তার থেকে এটি স্বাধীন হওয়ায় এটি এর নিজস্ব উত্তর হিসাবে কাজ করে। এছাড়াও এটি আমার সমস্যা স্থির করে।
Czarking

5

ওপিকে কিছুটা সম্পর্কহীন উত্তর তবে আমার মতো লোকদের জন্য কিছুটা একই সমস্যা।

কেস ব্যবহার করুন: উবুন্টু (সি, ক্লিয়ন, স্বতঃসমাপ্তি):

আমারও একই ত্রুটি ছিল,

সিএমকে ত্রুটি: লক্ষ্য "হ্যালো" এর জন্য লিঙ্কের ভাষা নির্ধারণ করতে পারে না।

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 ব্যবহার করছেন, এবং ভেবেছিলাম আমি সিএক্সএক্সএক্সপিআরএআরডিআর ভেরিয়েবলটি উল্লেখ করব, যা আমার মনে হয় প্রস্তাবিত উপায় cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html এবং হওয়া উচিত cmake 3.5 এ উপলব্ধ
ক্রিস কভারেট

2

আমার সি-ভিত্তিক কোডটি সংকলন করার সময়ও আমি একই ধরণের ত্রুটির মুখোমুখি হয়েছি। আমি আমার cmakeফাইলে উত্স ফাইলের পথটি সংশোধন করে সমস্যার সমাধান করেছি । আপনার cmakeফাইলে উল্লিখিত প্রতিটি উত্স ফাইলের উত্স ফাইলের পথটি পরীক্ষা করুন। এটি আপনাকেও সাহায্য করতে পারে।


1

কোনও উত্স ফাইল ছাড়াই একটি লাইব্রেরি তৈরি হওয়ার ক্ষেত্রে আমি আরও একটি সমাধান যুক্ত করতে চাই। এই জাতীয় গ্রন্থাগারগুলি কেবলমাত্র শিরোনামের গ্রন্থাগার হিসাবে পরিচিত । ডিফল্টরূপে add_libraryকমপক্ষে একটি উত্স ফাইল যুক্ত হওয়া বা অন্যথায় উল্লিখিত ত্রুটি দেখা দেয়। যেহেতু কেবলমাত্র শিরোনামের পাঠাগারগুলি বেশ সাধারণ, তাই INTERFACEএই জাতীয় লাইব্রেরি তৈরির জন্য সিএমকে কীওয়ার্ড রয়েছে । INTERFACEশব্দ নিচের চিত্রের ব্যবহার করা হয় এবং এটা লাইব্রেরিতে জোড়া খালি উৎস ফাইলের জন্য প্রয়োজন অবলুপ্তি ঘটিয়েছে।

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

উপরের উদাহরণটি সিএমকেলিস্ট.টেক্সট হিসাবে একই ডিরেক্টরিতে সমস্ত হেডার ফাইল সহ কেবল একটি শিরোনামের গ্রন্থাগার তৈরি করবে। {CMAKE_CURRENT_SOURCE_DIR}আপনার হেডার ফাইলগুলি CMakeLists.txt ফাইলের চেয়ে পৃথক ডিরেক্টরিতে রয়েছে এমন ক্ষেত্রে একটি প্রতিস্থাপন করুন।

কেবলমাত্র শিরোনামের গ্রন্থাগার এবং cmake সম্পর্কিত আরও তথ্যের জন্য এই ব্লগ পোস্ট বা cmake ডকুমেন্টেশন দেখুন


0

ডিফল্টরূপে জেএনআই নেটিভ ফোল্ডারটির নাম দেওয়া হয় jni । এটি সিপিপি-র নামকরণের ফলে সমস্যার সমাধান হয়েছে


-2

আমি পরিবর্তন করে আমার সমাধান করতে পরিচালিত

add_executable(file1.cpp)

প্রতি

add_executable(ProjectName file1.cpp)

-2

আমার ক্ষেত্রে, একটি শিরোনাম ফাইলে একটি শ্রেণীর সদস্য ফাংশন বাস্তবায়নের ফলে এই ত্রুটি ঘটায়। ইন্টারফেস (এক্সএইচ ফাইলে) আলাদা করা এবং বাস্তবায়ন (x.cpp ফাইলে) সমস্যার সমাধান করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.