সিএমকেকের জন্য কীভাবে নতুন জিসিসির পাথ নির্দিষ্ট করা যায়


122

আমার ওএস CentOS যা পাথ একটি ডিফল্ট জিসিসি হয়েছে /usr/bin/gcc। তবে এটি পুরানো, আমার সিসির একটি নতুন সংস্করণ প্রয়োজন। তাই আমি নতুন পথে একটি নতুন সংস্করণ ইনস্টল করেছি /usr/local/bin/gcc

তবে আমি যখন রান করি তখন cmakeএটি পুরানো সংস্করণ জিসিসি পাথ ( /usr/bin/gcc) ব্যবহার করে। আমি কীভাবে জিসিসিকে নতুন পথে ( /usr/local/bin/gcc) নির্দিষ্ট করতে পারি ।

আমি ওভাররাইট করার চেষ্টা করে থাকেন /usr/bin/gccসঙ্গে /usr/local/bin/gcc, কিন্তু এটা কাজ করে না।


2
আমি মনে করি /optপরিবর্তে বিকল্প জিসিসি সংস্করণটি ইনস্টল করা ভাল অভ্যাস /usr/local। সাধারণত /opt/gcc-x.y.z। এইভাবে, আপনার যদি আরও নতুন সংস্করণ প্রয়োজন হয় তবে আগের সংস্করণটি আনইনস্টল করতে আপনার কোনও সমস্যা হবে না।
ব্যবহারকারী 666412

উত্তর:


219

ওভাররাইট করবেন না CMAKE_C_COMPILER, তবে সিএমকে কল করার আগে রফতানি করুন CC(এবং CXX):

export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make

রফতানি কেবল একবারই করা দরকার, আপনি যখন প্রথমবার প্রকল্পটি কনফিগার করেন, তারপরে সেই মানগুলি সিএমকে ক্যাশে থেকে পঠিত হবে।


আপডেট : CMAKE_C(XX)_COMPILERজ্যাকের মন্তব্যের পরে কেন ওভাররাইড হচ্ছে না সে সম্পর্কে দীর্ঘতর ব্যাখ্যা

আমি CMAKE_C(XX)_COMPILERমূলত দুটি মূল কারণে ওভাররাইডিংয়ের বিরুদ্ধে সুপারিশ করছি : কারণ এটি সিএমকের ক্যাশে ভালভাবে খেলবে না এবং কারণ এটি সংকলক চেক এবং সরঞ্জাম আবিষ্কার সনাক্ত করে break

setকমান্ডটি ব্যবহার করার সময় , আপনার কাছে তিনটি বিকল্প রয়েছে:

  • একটি সাধারণ পরিবর্তনশীল তৈরি করতে, ক্যাশে ছাড়াই
  • ক্যাশে সহ, একটি ক্যাশেড ভেরিয়েবল তৈরি করতে
  • কনফিগার করার সময় সর্বদা ক্যাশে মান প্রয়োগ করতে বাধ্য করুন

আসুন দেখুন তিনটি সম্ভাব্য কলের জন্য কী ঘটে set:

ক্যাশে ছাড়া

set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)

এটি করার সময়, আপনি একটি "সাধারণ" ভেরিয়েবল তৈরি করেন CMAKE_C(XX)_COMPILERযা একই নামের ক্যাশে ভেরিয়েবলটি আড়াল করে। তার মানে আপনার সংকলকটি এখন আপনার বিল্ড স্ক্রিপ্টে হার্ড-কোডড এবং আপনি এটিকে একটি কাস্টম মান দিতে পারবেন না। আপনার যদি বিভিন্ন সংকলক সহ একাধিক বিল্ড এনভায়রনমেন্ট থাকে তবে এটি একটি সমস্যা হবে। আপনি যখনই আলাদা আলাদা সংকলক ব্যবহার করতে চান প্রতিবার আপনি নিজের স্ক্রিপ্টটি আপডেট করতে পারেন তবে এটি সিএমকে ব্যবহারের মানটিকে প্রথম স্থানে সরিয়ে দেয়।

ঠিক আছে, তাহলে, ক্যাশে আপডেট করা যাক ...

ক্যাশে দিয়ে

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")

এই সংস্করণটি কেবল "কাজ করবে না"। CMAKE_C(XX)_COMPILERপরিবর্তনশীল যদি না আপনি এটা জোর তাই এটি আপডেট হবে না ক্যাশের মধ্যে ইতিমধ্যে হয়।

আহ ... আসুন শক্তিটি ব্যবহার করা যাক, ...

জোর করে ক্যাশে

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)

এটি প্রায় "সাধারণ" ভেরিয়েবল সংস্করণ হিসাবে একই, একমাত্র পার্থক্য হ'ল আপনার মানটি ক্যাশে সেট করা হবে, যাতে ব্যবহারকারীরা এটি দেখতে পারেন। তবে যে কোনও পরিবর্তন setকমান্ড দ্বারা ওভাররাইট করা হবে ।

সংকলক চেক এবং টুলিং ব্রেকিং

কনফিগারেশন প্রক্রিয়া শুরুর দিকে, সিএমকে সংকলকটিতে চেক সঞ্চালন করে: এটি কি কাজ করে? এটি কি এক্সিকিউটেবল উত্পাদন করতে সক্ষম? ইত্যাদি। এটি সম্পর্কিত সরঞ্জামগুলি সনাক্ত করতে arএবং পছন্দ করতে সংকলকটিও ব্যবহার করে ranlib। আপনি যখন কোনও স্ক্রিপ্টে সংকলক মানটি ওভাররাইড করেন, তখন "চূড়ান্ত দেরি" হয়, সমস্ত চেক এবং সনাক্তকরণ ইতিমধ্যে সম্পন্ন হয়েছে।

উদাহরণস্বরূপ, ডিফল্ট কম্পাইলার হিসেবে জিসিসি সঙ্গে আমার মেশিনে যখন ব্যবহার setকমান্ড /usr/bin/clang, arসেট করা হয় /usr/bin/gcc-ar-7। সিএমকে চালানোর আগে রফতানি ব্যবহার করার সময় এটি সেট করা আছে /usr/lib/llvm-3.8/bin/llvm-ar


অলসদের জন্য সমান, যদি আপনার which gccwhich g++
comp

11
অলসদের জন্য সমান, যদি আপনার export CC=`which gcc` export CXX=`which g++`
comp

যদি সিসি / সিএক্সএক্স পথ থেকে পৃথক হয় তবে আমি পাইIncorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
লিলিথ রিভার

1
আমি উইন্ডোজ এ থাকলে কীভাবে করব?
এমআর 5

5
আসলে, সেটিং CMAKE_C_COMPILERসুষ্ঠু কর্ম সঞ্চালনে সহায়ক প্রদত্ত আপনি এটা কমান্ড লাইন ব্যবহার করে তা করতে: $ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source
এরওয়ান লেগ্রান্ড

25

এই প্রশ্নটি বেশ পুরানো তবে এখনও গুগল অনুসন্ধানে সক্রিয়। গৃহীত প্রশ্নটি আমার পক্ষে আর কাজ করছে না এবং মনে হচ্ছে এটি বয়স্ক। Cmake সম্পর্কে সর্বশেষ তথ্য cmake FAQ লেখা আছে ।

আপনার সংকলকের পথ পরিবর্তন করার বিভিন্ন উপায় রয়েছে। একটি উপায় হবে

CMAKE_FOO_COMPILERকমান্ড-লাইনের সাহায্যে উপযুক্ত বৈকল্পক (গুলি) একটি বৈধ সংকলক নাম বা পূর্ণ পথে সেট করুন cmake -D। উদাহরণ স্বরূপ:

cmake -G "Your Generator" -D CMAKE_C_COMPILER=gcc-4.2 -D CMAKE_CXX_COMPILER=g++-4.2 path/to/your/source

পরিবর্তে gcc-4.2আপনি path/to/your/compilerএই মত লিখতে পারেন

 cmake -D CMAKE_C_COMPILER=/path/to/gcc/bin/gcc -D CMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ .

2
আমি পুরানো সংকলক (জিসিসি 5.3) এ একটি পুরানো প্রকল্প তৈরি করার সময় এমনটি করছিলাম যখন একটি নতুন সংকলক (জিসিসি 7.3) পরিবেশে উত্সাহিত হয়েছিল। এটা তোলে জরিমানা নির্মিত এবং আমার মেশিনে কাজ করেন, কিন্তু একবার আমি একটি ভিন্ন মেশিনে এক্সিকিউটেবল সরানো আমি উপলব্ধি প্রোগ্রাম আগে থেকে libstdc ++ লিঙ্ক করা হয়েছে, যাতে থেকে পরিবর্তে 7.3 অনুরোধ 5.3 ... sourced।
আদম বাদুরা


3

এক্সপ্রেসটি কোন জিসিসি / জি ++ এর কোন সংস্করণ ব্যবহার করবেন সে সম্পর্কে নির্দিষ্ট হওয়া উচিত, কারণ যদি ব্যবহারকারীটির একাধিক সংকলক সংস্করণ থাকে, তবে এটি সফলভাবে সংকলন করবে না।

 export CC=path_of_gcc/gcc-version
 export CXX=path_of_g++/g++-version
 cmake  path_of_project_contain_CMakeList.txt
 make 

প্রকল্পের ব্যবহারে সি ++ 11 ব্যবহারের ক্ষেত্রে -std=C++-11এটি সিএমকেলিস্ট.টেক্সটে ফ্ল্যাগ ব্যবহার করে পরিচালনা করা যেতে পারে


2

একটি বিকল্প সমাধান হ'ল ক্লিন বিল্ড ডিরেক্টরি থেকে শুরু করে আপনার প্রকল্পটি সিএমকে-গুইয়ের মাধ্যমে কনফিগার করা। শুরুতে আপনার কাছে উপলভ্য অপশনগুলির মধ্যে কম্পাইলারগুলির সঠিক পথটি বেছে নেওয়ার সম্ভাবনা রয়েছে


2

এটি কেবল সাথেই নয় cmake, ./configureএবং এর সাথেও কাজ করে make:

./configure CC=/usr/local/bin/gcc CXX=/usr/local/bin/g++

যার ফলস্বরূপ:

checking for gcc... /usr/local/bin/gcc
checking whether the C compiler works... yes

0

CMAKE_<LANG>_COMPILERপুনরায় কনফিগার না করে পথ পরিবর্তন করুন

আমি একটি বিকল্প সংকলক দিয়ে সংকলন করতে চেয়েছিলাম, কিন্তু কমান্ড-লাইনে পাস-ডি বিকল্পগুলিও যা একটি পৃথক সংকলক সেট করে মুছে ফেলা হবে। এটি ঘটে কারণ এটি পুনরায় কনফিগার করে। কৌশলটি হ'ল এর সাথে সংকলক সনাক্তকরণটি অক্ষম করে , তারপরে NONEপাথ সেট করে ।FORCEenable_language

project( sample_project NONE )

set( COMPILER_BIN /opt/compiler/bin )
set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" FORCE )
set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" FORCE )

enable_language( C CXX )

একটি সরঞ্জামচেন ফাইল ব্যবহার করুন

আরও বুদ্ধিমান পছন্দ হ'ল একটি সরঞ্জামচেন ফাইল তৈরি করা।

set( CMAKE_SYSTEM_NAME Darwin )

set( COMPILER_BIN /opt/compiler/bin )
set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" )
set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" )

তারপরে আপনি একটি অতিরিক্ত পতাকা দিয়ে চাঁদকে প্রার্থনা করুন

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