কেন আপনাকে সিটিতে গণিত লাইব্রেরিটি সংযুক্ত করতে হবে?


254

আমি যদি কোনও সি প্রোগ্রামে অন্তর্ভুক্ত করি <stdlib.h>বা <stdio.h>সি প্রোগ্রামে অন্তর্ভুক্ত করি তবে সংকলন করার সময় আমার এগুলি লিঙ্ক করতে হবে না তবে জিসিসি <math.h>ব্যবহার করে আমাকে লিঙ্ক করতে হবে , -lmউদাহরণস্বরূপ:

gcc test.c -o test -lm

এটার কারণ কি? আমাকে অন্যান্য লাইব্রেরিগুলিতে নয় তবে কেন স্পষ্টভাবে গণিত গ্রন্থাগারটি লিঙ্ক করতে হবে?

উত্তর:


249

ইন ফাংশান stdlib.hএবং stdio.hমধ্যে বাস্তবায়নের আছে libc.so(অথবা libc.aস্ট্যাটিক লিঙ্ক করার জন্য), (যেন যা ডিফল্টভাবে আপনার এক্সিকিউটেবল মধ্যে লিঙ্ক করা হয়েছে -lcনির্দিষ্ট ছিল না)। জিসিসি সঙ্গে এই স্বয়ংক্রিয় লিংক এড়াতে নির্দেশ দেওয়া সম্ভব হবে -nostdlibবা -nodefaultlibsঅপশন।

গণিতের ফাংশনগুলিতে (বা স্ট্যাটিক লিঙ্কিংয়ের জন্য) math.hবাস্তবায়ন রয়েছে এবং এটি ডিফল্টরূপে লিংক হয় না। এই / বিভক্ত হওয়ার historicalতিহাসিক কারণ রয়েছে , এদের কোনওটিই খুব বিশ্বাসী নয়।libm.solibm.alibmlibmlibc

মজার বিষয় হল, সি ++ রানটাইমের libstdc++প্রয়োজন libm, তাই আপনি যদি জিসিসি ( g++) দিয়ে একটি সি ++ প্রোগ্রাম সংকলন করেন তবে আপনি স্বয়ংক্রিয়ভাবে libmলিঙ্ক হয়ে যাবেন ।


8
লিনাক্সের সাথে এটির কোনও সম্পর্ক নেই, কারণ লিনাক্সের আগে এটি প্রচলিত ছিল। আমি সন্দেহ করি এক্সিকিউটেবল আকার হ্রাস করার চেষ্টা করার সাথে এর কিছু করার আছে কারণ যে প্রচুর প্রোগ্রাম রয়েছে যেগুলিতে গণিতের ফাংশন প্রয়োজন হয় না।
ডেভিড থর্নলি

39
প্রাচীন সিস্টেমে, যদি গণিত ফাংশনগুলি libc তে অন্তর্ভুক্ত থাকে তবে সমস্ত প্রোগ্রাম সংকলন করা ধীর হবে, আউটপুট এক্সিকিউটেবলগুলি আরও বড় হবে এবং রানটাইমের জন্য আরও মেমরির প্রয়োজন ছিল, বেশিরভাগ প্রোগ্রামগুলিতে কোনও লাভ নেই যা এই গণিত ফাংশনগুলিতে মোটেই ব্যবহার করে না। আজকাল আমাদের ভাগ করা লাইব্রেরিগুলির জন্য ভাল সমর্থন রয়েছে এবং স্ট্যাটিকালি লিঙ্কিংয়ের সময়ও, স্ট্যান্ডার্ড লাইব্রেরিগুলি সেট আপ করা হয়েছে যাতে অব্যবহৃত কোডটি ফেলে দেওয়া যায়, সুতরাং এর কোনওটিই আর ভাল কারণ নয়।
মহিমান্বিত

38
@ প্রিমিয়েন্ট এমনকি পুরানো দিনগুলিতে, একটি লাইব্রেরির সাথে লিঙ্ক করা লাইব্রেরির সমস্ত সামগ্রী কার্যকর করতে সক্ষম হয় না। লিঙ্কারগুলি, যদিও প্রায়শই অবহেলিত প্রযুক্তি, historতিহাসিকভাবে বেশ দক্ষ ছিল ent

7
@ ফেফিয়েন্ট এছাড়াও, ভাগ করা লাইব্রেরিগুলি আপনার মনে হতে পারে তার চেয়ে বেশি সময় ধরে ছিল। এগুলি ১৯50০-এর দশকে নয়, ১৯৫০-এর দশকে আবিষ্কার হয়েছিল।

5
আমি মনে করি দিনের শেষে আমরা যা দেখছি তা জিসিসি রক্ষণশীলতা ছাড়া আর কিছুই নয়: "এটি সর্বদা এরকমভাবে কাজ করা হয়েছে"। আমি কেবল চাই যে তারা তাদের সংকলক এক্সটেনশনে একই যুক্তি প্রয়োগ করেছে।

77

মনে রাখবেন যে সি একটি পুরানো ভাষা এবং এফপিইউগুলি তুলনামূলকভাবে সাম্প্রতিক ঘটনা। আমি সিটি প্রথম 8-বিট প্রসেসরের উপর দেখেছি যেখানে 32-বিট পূর্ণসংখ্যার গাণিতিকও করা অনেক কাজ ছিল। এই বাস্তবায়নের অনেকের কাছে একটি ভাসমান পয়েন্ট গণিতের পাঠাগারও পাওয়া যায় নি!

এমনকি প্রথম 68000 মেশিনে (ম্যাক, আতারি এসটি, অমিগা), ভাসমান পয়েন্ট কপো প্রসেসরগুলি প্রায়শই ব্যয়বহুল অ্যাড-অন ছিল।

এই সমস্ত ভাসমান পয়েন্ট গণিত করতে আপনার একটি দুর্দান্ত আকারের গ্রন্থাগার দরকার। এবং গণিত ধীর হতে চলেছে। সুতরাং আপনি খুব কমই ভাসা ব্যবহার করেছেন। আপনি পূর্ণসংখ্যা বা ছোট আকারের পূর্ণসংখ্যা দিয়ে সবকিছু করার চেষ্টা করেছিলেন। যখন আপনাকে math.h অন্তর্ভুক্ত করতে হবে, আপনি আপনার দাঁত গ্রিট করেছিলেন। প্রায়শই, আপনি এটিকে এড়াতে আপনার নিজের অনুমান এবং অনুসন্ধানের টেবিলগুলি লিখতেন।

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

এই কারণেই গণিতের মান ছিল না । অনেক বা সম্ভবত বেশিরভাগ প্রোগ্রাম একটি ফ্লোট ব্যবহার করেনি। যদি এফপিইউগুলি সবসময়ই ছিল এবং ফ্লোটস এবং ডাবলগুলি সর্বদা চালিত করার জন্য সস্তা ছিল তবে সন্দেহ নেই যে "স্টাডম্যাথ" হত।


হেই, আমি জাভাতে (1 + x) ^ y এর জন্য প্যাড আনুষঙ্গিক ব্যবহার করছি, একটি ডেস্কটপ পিসিতে। লগ, এক্সপ এবং পাও এখনও ধীর।
কোয়ান্ট_দেব

ভাল যুক্তি. এবং আমি অডিও প্লাগইনগুলিতে পাপের () প্রায় অনুমান দেখতে পেয়েছি।
নসরেডনা

11
এই ব্যাখ্যা দিয়েছে কেন libmডিফল্টরূপে সংযুক্ত করা হয় না, কিন্তু গণিত ছিল মান C89 থেকে এবং তার আগে, কে অ্যান্ড আর ছিল কার্যত এটা মান, তাই আপনার "stdmath" মন্তব্য অর্থে দেখা যায় না।
ফ্রেড ফু

@ ফ্রেডফু প্রকার ও ইন্টারফেস মানসম্মত হয়েছিল, তবে বাস্তবায়ন নয়। আমি মনে করি নসরেডনা একটি স্ট্যান্ডার্ড গণিত গ্রন্থাগারের উল্লেখ করছেন।
টিম বার্ড

72

হাস্যকর historicalতিহাসিক অনুশীলনের কারণে যে কেউ ঠিক করতে রাজি নয়। সি এবং পসিক্স দ্বারা প্রয়োজনীয় সমস্ত ফাংশনকে একটি একক গ্রন্থাগারের ফাইলে একত্রিত করা কেবল এই প্রশ্নটি বার বার জিজ্ঞাসা করা এড়াতে পারে না, তবে ডায়নামিক লিঙ্কিংয়ের সময় একটি গুরুত্বপূর্ণ পরিমাণ এবং সময় এবং স্মৃতিও সংরক্ষণ করতে পারে, যেহেতু লিঙ্কযুক্ত প্রতিটি .soফাইলকে ফাইল সিস্টেমের ক্রিয়াকলাপ প্রয়োজন এটি সনাক্ত করতে এবং এটির সন্ধান করতে এবং এর স্ট্যাটিক ভেরিয়েবল, স্থানান্তরকরণ ইত্যাদির জন্য কয়েকটি পৃষ্ঠা

একটি বাস্তবায়ন যেখানে সব ফাংশন এক গ্রন্থাগার এবং এতে আছে -lm, -lpthread,-lrt , ইত্যাদি অপশন সব নো অপস (অথবা খালি লিঙ্ক আছে .aফাইল) পুরোপুরি হয় POSIX conformant এবং অবশ্যই বাঞ্ছনীয়।

দ্রষ্টব্য: আমি পসিএক্স সম্পর্কে কথা বলছি কারণ সি নিজেই সংকলকটি কীভাবে আহ্বান করা হয়েছে সে সম্পর্কে কিছুই নির্দিষ্ট করে না। এইভাবে আপনি gcc -std=c99 -lmকার্যকরভাবে আচরণের জন্য কম্পাইলারকে অবশ্যই প্রয়োগ-নির্দিষ্ট পদ্ধতি হিসাবে বিবেচনা করতে পারেন ।


9
POSIX এর জন্য পৃথক libm, libc এবং librt লাইব্রেরি উপস্থিত থাকার প্রয়োজন নেই তা নির্দেশ করার জন্য +1। উদাহরণস্বরূপ, ম্যাক ওএসে সমস্ত কিছুই একটি একক লিবিসিস্টেমে অবস্থিত (যার মধ্যে রয়েছে libdbm, libdl, libgcc_s, libinfo, libm, libpoll, libproc এবং librpcsvc)।
F'x

3
Link1 কোনও লিঙ্ক, বা সংখ্যার সাথে ব্যাক আপ না করে পারফরম্যান্সে লাইব্রেরি লুকের প্রভাব সম্পর্কে অনুমানের জন্য .1। "প্রোফাইল। অনুমান করবেন না"
F'x

12
এটি জল্পনা নয়। আমার কাছে কোনও প্রকাশিত কাগজপত্র নেই, তবে আমি সমস্ত পরিমাপ নিজেই করেছি এবং পার্থক্যটি বিশাল। straceডায়নামিক লিঙ্কিংয়ে প্রারম্ভকালীন সময়টি কত ব্যয় হয় তা দেখার জন্য কেবল একটি সময় বিকল্পের সাহায্যে ব্যবহার করুন, বা ./configureএমন কোনও সিস্টেমে চলমান তুলনা করুন যেখানে সমস্ত স্ট্যান্ডার্ড ইউটিলিটিগুলি স্থির-লিঙ্কযুক্ত যেখানে তারা গতিশীল-সংযুক্ত রয়েছে। এমনকি মূলধারার ডেস্কটপ অ্যাপ্লিকেশন বিকাশকারী এবং সিস্টেম ইন্টিগ্রেটাররা গতিশীল লিঙ্কিংয়ের ব্যয় সম্পর্কে সচেতন; এই কারণেই প্রিলিংকের মতো জিনিস বিদ্যমান। আমি নিশ্চিত যে আপনি এই কয়েকটি কাগজপত্রের মধ্যে মানদণ্ডগুলি খুঁজে পেতে পারেন।
আর .. গীটহাব বন্ধ করুন ICE

1
লক্ষ্য করুন POSIX নেই প্রয়োজন -lmগৃহীত করা এবং যা গণিত ইন্টারফেসগুলি ব্যবহার ব্যবহার করা আবশ্যক অ্যাপ্লিকেশন -lm, কিন্তু এটা একটি অভ্যন্তরীণ বিকল্প ঘাঁটা (অথবা এমনকি উপেক্ষা করা হয়) কম্পাইলার কমান্ড নয় কোনো প্রকৃত গ্রন্থাগার ফাইল দ্বারা হতে পারে। .aইন্টারফেসগুলি মূল লিবিসিটিতে থাকলে এটি কেবল একটি খালি ফাইল হতে পারে ।
আর .. গীটহাব বন্ধ করুন ICE

6
@ এফএক্স: কেন আমি আগে এটি উল্লেখ করতে ভুলে গেছি তা জানেন না: strace -ttডায়নামিক লিঙ্কিংয়ে ব্যয় করা সময়টি সহজেই আপনাকে প্রদর্শন করবে। এটা সুন্দর না। এবং লিনাক্সে, পরিদর্শন করা /proc/sys/smapsআপনাকে অতিরিক্ত লাইব্রেরির মেমরির ওভারহেড প্রদর্শন করবে।
আর .. গীটহাব বন্ধ হেল্পিং আইসিসি

33

কারণ time()এবং কিছু অন্যান্য ফাংশন builtinসি লাইব্রেরিতে ( libc) নিজেই সংজ্ঞায়িত করা হয় এবং আপনি সংকলন বিকল্পটি ব্যবহার না করা না করে GCC সর্বদা libc এর সাথে লিঙ্ক করে । তবে গণিত ফাংশন লাইভ-ffreestandinglibm যা জিসিসি দ্বারা স্পষ্টভাবে লিঙ্কযুক্ত নয়।


8
এলএলভিএম জিসিসিতে আমাকে -lm যুক্ত করতে হবে না। কেন?
বট 47

26

এখানে একটি ব্যাখ্যা দেওয়া হয়েছে :

সুতরাং যদি আপনার প্রোগ্রামটি গণিত ফাংশন ব্যবহার করে এবং অন্তর্ভুক্ত math.hকরে থাকে তবে -lmপতাকাটি পাস করে আপনাকে স্পষ্টভাবে গণিতের লাইব্রেরিটি লিঙ্ক করতে হবে । এই বিশেষ বিচ্ছেদের কারণটি হ'ল গণিতবিদরা যেভাবে তাদের গণিতটি গণনা করা হচ্ছে তা সম্পর্কে খুব পিক এবং তারা মানক প্রয়োগের পরিবর্তে গণিতের ক্রিয়াকলাপগুলির নিজস্ব প্রয়োগটি ব্যবহার করতে চাইতে পারেন। যদি গণিতের ক্রিয়াকলাপগুলি লম্পট করা হয় তবে libc.aএটি করা সম্ভব হবে না।

[সম্পাদনা]

যদিও আমি নিশ্চিত নই যে আমি এটির সাথে একমত হই। যদি আপনার কাছে এমন একটি গ্রন্থাগার থাকে যা সরবরাহ করে, বলে, sqrt()এবং আপনি এটি স্ট্যান্ডার্ড লাইব্রেরির আগে পাস করেন, তবে কোনও ইউনিক্স লিঙ্কার আপনার সংস্করণটি নেবে, তাই না?


10
আমি মনে করি না যে গ্যারান্টি আছে যা ঘটবে; পরিবর্তে আপনি প্রতীক দ্বন্দ্বের সাথে শেষ হতে পারেন। এটি সম্ভবত লিঙ্কার এবং গ্রন্থাগারের বিন্যাসের উপর নির্ভর করবে। আমি এখনও সেই কারণটিকে দুর্বল বলে মনে করি; যদি আপনি একটি কাস্টম স্কয়ার্ট ফাংশন করছেন, আপনার সত্যই এটি স্ট্যান্ডার্ড স্কয়ার্ট ফাংশনটির মতো একই নাম দেওয়া উচিত নয়, এমনকি যদি এটি একই জিনিস করে ...
প্রবন্ধটি

1
প্রকৃতপক্ষে, আপনার নিজের ফাংশনটি (অ স্থিতিশীল) নামের sqrtফলাফল তৈরি করা কোনও প্রোগ্রামে অনির্ধারিত আচরণ সহ করে।
আর .. গিথহাব বন্ধ হেল্পিং আইসিসি

পছন্দ করুন এবং আপনার বক্তব্য অবধি, আপনি "স্ট্যান্ডার্ড লাইব্রেরির আগে" বলতে কী বোঝায়? আমি ভেবেছিলাম, স্ট্যান্ডার্ড লাইব্রেরিটি ডিফল্টরূপে লিঙ্কযুক্ত এবং কমান্ড লাইন বিকল্পের মাধ্যমে সংযুক্ত হওয়ার দরকার নেই। সুতরাং, লিঙ্কারের জন্য স্ট্যান্ডার্ড লাইব্রেরিটি সর্বপ্রথম যাবে এবং "স্ট্যান্ডার্ড লাইব্রেরির আগে" তাদের নিজস্ব প্রয়োগ করা যাবে না।
রকি ইন্দে

@ রকি ইন্ডি: আমার উত্তরটি দেখুন, আমি মনে করি আমি আসলে "স্ট্যান্ডার্ড গণিত গ্রন্থাগারের আগে" বোঝাচ্ছিলাম। তবে আমি মনে করি স্ট্যান্ডার্ড সি লাইব্রেরিটি লিঙ্ক না করার জন্য সংকলক বিকল্প রয়েছে, যা আপনাকে নিজের পাস করার অনুমতি দেবে।
বাসটিয়েন লোনার্ডার্ড

@ বাসটিএলোনার্ড আমি version.২ সংস্করণের জিসিসি ব্যবহার করি, -lmএটি সম্পূর্ণ alচ্ছিক । কোনও ধারণা
দোঙ্গুয়া লিউ

5

জিসিসির একটি পরিচিতিতে বাহ্যিক লাইব্রেরিগুলির সাথে সংযোগ স্থাপন সম্পর্কে বহুল আলোচনা রয়েছে - বাহ্যিক গ্রন্থাগারের সাথে সংযোগ স্থাপন । যদি কোনও লাইব্রেরি স্ট্যান্ডার্ড লাইব্রেরির সদস্য (যেমন স্টডিও) থাকে তবে তাদের লিঙ্ক করার জন্য আপনাকে সংকলকটির (সত্যিকারের লিঙ্কার) নির্দিষ্ট করার দরকার নেই।

সম্পাদনা: অন্যান্য উত্তর এবং মন্তব্যগুলির কয়েকটি পড়ার পরে, আমার মনে হয় যে এই দুটি লিঙ্কের সাথে লিবিস.এ রেফারেন্স এবং লিবিম রেফারেন্সের যোগসূত্র রয়েছে যেগুলি দুটি পৃথক কেন তা সম্পর্কে অনেক কিছু আছে।

মনে রাখবেন যে 'libm.a' (গণিত গ্রন্থাগার) এর অনেকগুলি ফাংশন 'math.h' এ সংজ্ঞায়িত করা হয় তবে libc.a তে উপস্থিত থাকে না Note কিছু রয়েছে, যা বিভ্রান্ত হয়ে উঠতে পারে, তবে থাম্বের নিয়মটি হ'ল - সি লাইব্রেরিতে সেই ফাংশনগুলি রয়েছে যা এএনএসআই দ্বারা নির্ধারিত হওয়া আবশ্যক, যাতে আপনার কেবলমাত্র এএনএসআই ফাংশনগুলি ব্যবহার করা হয় যদি আপনাকে এলএমের প্রয়োজন হয় না। বিপরীতে, 'libm.a' আরও ফাংশন ধারণ করে এবং অতিরিক্ত কার্যকারিতা যেমন ম্যাথার কল-ব্যাক এবং এফপি ত্রুটির ক্ষেত্রে আচরণের বেশ কয়েকটি বিকল্প মানের সম্মতি হিসাবে সমর্থন করে supports আরও তথ্যের জন্য বিভাগটি লিবিম দেখুন।


1
আপনাকে আলাদাভাবে কেন ম্যাচ লাইব্রেরিতে লিঙ্ক করতে হবে এই প্রশ্নের উত্তর দেয় না। স্পষ্টতই আপনি ওপেনজিএল লাইব্রেরিগুলি পৃথকভাবে লিঙ্ক করতে চান তবে যুক্তিযুক্তভাবে গণিতের লাইব্রেরিগুলি সাধারণত দরকারী generally
ডেভিড থর্নলে

@ ডেভিড: ঠিক আছে আপনি এই প্রশ্নটি আমার কাছে পরিষ্কার ছিল না যে ওপি এটিই ছিল asking আপনার মন্তব্য হিসাবে আমি আমার উত্তর সম্পাদনা করছি।
দ্য টিকটিকিটি

আমি sqrtফাংশনটি ব্যবহার করে এমন একটি প্রোগ্রাম সংকলন করার কারণটি জানি এবং এটি লাইব্রেরিটি না করে কাজ করে -lm। ধন্যবাদ!
L_K

5

যেমনটি বলা হয়েছে, সি লাইব্রেরি লাইবসিটি ডিফল্টরূপে সংযুক্ত এবং এই লাইব্রেরিতে stdlib.h, stdio.h এবং অন্যান্য বেশ কয়েকটি মানক শিরোলেখ ফাইলগুলি প্রয়োগ করা রয়েছে। এটিতে যুক্ত করার জন্য, " জিসিসির একটি পরিচিতি " অনুসারে সি-তে একটি বেসিক "হ্যালো ওয়ার্ল্ড" প্রোগ্রামের লিঙ্কার কমান্ডটি নীচে রয়েছে:

ld -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o 
/usr/lib/crti.o /usr/libgcc-lib /i686/3.3.1/crtbegin.o
-L/usr/lib/gcc-lib/i686/3.3.1 hello.o -lgcc -lgcc_eh -lc 
-lgcc -lgcc_eh /usr/lib/gcc-lib/i686/3.3.1/crtend.o /usr/lib/crtn.o

সি লাইব্রেরির সাথে সংযুক্ত তৃতীয় লাইনের বিকল্পটি -lc লক্ষ্য করুন ।


3

আমি মনে করি এটি একরকম স্বেচ্ছাচারিতা। আপনাকে কোথাও একটি লাইন আঁকতে হবে (কোন লাইব্রেরিগুলি ডিফল্ট এবং কোনটি নির্দিষ্ট করতে হবে)।

এটি আপনাকে একই আলাদা ফাংশনযুক্ত একটি আলাদা করে এটি প্রতিস্থাপনের সুযোগ দেয় তবে এটি করা খুব সাধারণ বিষয় বলে আমি মনে করি না।

সম্পাদনা: (আমার নিজের মন্তব্য থেকে): আমি মনে করি যে সিসি মূল সিসির সাথে পিছনের দিকে সামঞ্জস্য বজায় রাখতে এটি করে। সিসি এটি কেন কাজ করে তার জন্য আমার অনুমান কারণ সময়টি ছিল - সিসি আমাদের চেয়ে এখনকার তুলনায় অনেক কম শক্তিযুক্ত মেশিনগুলির জন্য লেখা হয়েছিল। প্রচুর প্রোগ্রামগুলির কোনও ফ্লোটিং-পয়েন্ট গণিত নেই এবং তারা সম্ভবত এমন প্রতিটি লাইব্রেরি নিয়েছিলেন যা সাধারণত ডিফল্টর বাইরে ব্যবহৃত হয় না। আমি অনুমান করছি যে ইউনিক্স ওএসের বিল্ড টাইম এবং এর সাথে যে সরঞ্জামগুলি চলে সেগুলি চালিকা শক্তি ছিল।


আমি মনে করি এই প্রশ্নের পিছনে মানসিকতা হ'ল লিবমের বিষয়বস্তুগুলি মূলত স্ট্যান্ডার্ড সি লাইব্রেরির অংশ, কেন তারা লিবিসিতে নেই?
ইভান তেরান

1
কেন সিসিটির জন্য এটিটি অ্যান্ড টি টি ইউনিক্সের মূল সিসির সাথে সামঞ্জস্য বজায় রাখা। আমি 1988 সালে 3B2s ব্যবহার করেছি এবং আপনি গণিত পেতে -lm করতে হবে। এ সময়টি আমার কাছে সম্পূর্ণ স্বেচ্ছাচারী বলে মনে হয়েছিল। ভিজ্যুয়াল স্টুডিওতে, আমি কখনও গণিত যোগ করার কথা মনে করি না, তবে আপনাকে কখনও কখনও সি-রানটাইম লাইব্রেরি যুক্ত হতে পারে। আমি ধরে নিই যে সংকলক বিক্রেতাদের একটি কারণ রয়েছে (বিল্ড টাইম?), তবে এই মুহূর্তে, আমি বাজি জিসি স্রেফ পিছনের দিকে সামঞ্জস্যপূর্ণ হওয়ার চেষ্টা করছি।
লু ফ্রাঙ্কো

3

যদি আমি stdlib.h বা stdio.h রাখি, আমার সেগুলি লিঙ্ক করতে হবে না তবে সংকলন করার সময় আমার লিঙ্ক করতে হবে:

stdlib.h, stdio.h শিরোনাম ফাইল হয়। আপনি আপনার সুবিধার জন্য এগুলি অন্তর্ভুক্ত করুন। আপনি যদি সঠিক লাইব্রেরিতে লিঙ্ক করেন তবে কোন চিহ্নগুলি উপলব্ধ হবে তা কেবলমাত্র তারা পূর্বাভাস দেয়। বাস্তবায়নগুলি লাইব্রেরির ফাইলগুলিতে থাকে, যেখানে ফাংশনগুলি সত্যই সেখানে থাকে।

সুদ্ধ math.h সব ম্যাথ ফাংশন অ্যাক্সেস হত্তন একমাত্র প্রথম ধাপ।

এছাড়াও, আপনি libmযদি এটির ফাংশনগুলি ব্যবহার না করেন তবে আপনার সাথে লিঙ্ক তৈরি করতে হবে না, এমনকি যদি আপনি এমন কিছু করেন #include <math.h>যা আপনার জন্য চিহ্নগুলির সংকলকটির জন্য কেবল একটি তথ্যমূলক পদক্ষেপ।

stdlib.h, stdio.hউপলভ্য ফাংশনগুলি দেখুন libc, যা সর্বদা লিঙ্কযুক্ত হয় যাতে ব্যবহারকারীর এটি নিজে করতে না হয়।


2

stdio স্ট্যান্ডার্ড সি লাইব্রেরির অংশ যা ডিফল্টরূপে, gcc এর সাথে লিঙ্ক করবে।

গণিত ফাংশন বাস্তবায়নগুলি একটি পৃথক লিবিএম ফাইলে রয়েছে যা ডিফল্টরূপে লিঙ্কযুক্ত নয় সুতরাং আপনাকে এটি -lm নির্দিষ্ট করতে হবে। যাইহোক, সেই হেডার ফাইল এবং লাইব্রেরি ফাইলগুলির মধ্যে কোনও সম্পর্ক নেই।


3
তিনি জানেন যে তিনি কেন
ইভান তেরান

তিনি বলেন কেন। সাইমন ব্যাখ্যা করেছেন যে কয়েকটি লাইব্রেরি ডিফল্টরূপে স্টাডিয়োর সাথে সংযুক্ত রয়েছে যেখানে গণিতের পাঠাগারটি ডিফল্টরূপে লিঙ্কযুক্ত নয় তাই এটি নির্দিষ্ট করতে হবে।
mnuzzo

5
আমি বলব যে প্রশ্নটির প্রকৃতি জিজ্ঞাসা করছে যে কেন লিবিম ডিফল্টরূপে লিঙ্ক করা হয় না (বা এমনকি libc থেকে পৃথক করা হয়) কারণ এর বিষয়বস্তু মূলত সি স্ট্যান্ডার্ড লাইব্রেরির অংশ part
ইভান তেরান

2

আমি অনুমান করব যে এটি এমন একটি অ্যাপ্লিকেশনগুলি তৈরি করার একটি উপায় যা এটি ব্যবহার না করে কিছুটা আরও ভাল পারফর্ম করে। এই সম্পর্কে আমার চিন্তাভাবনা এখানে।

x86 ওএসস (এবং আমি অন্যদের কল্পনাও করি) প্রসঙ্গে স্যুইচ এফপিইউ স্টেট সংরক্ষণ করতে হবে। তবে, অ্যাপ্লিকেশন প্রথমবারের জন্য এফপিইউ ব্যবহার করার চেষ্টা করার পরে বেশিরভাগ ওএস কেবলমাত্র এই রাষ্ট্রটি সংরক্ষণ / পুনরুদ্ধার করতে বিরক্ত করে।

এগুলি ছাড়াও, সম্ভবত গণিত পাঠাগারটিতে এমন কিছু প্রাথমিক কোড রয়েছে যা লাইব্রেরিটি লোড হওয়ার সাথে সাথে FPU কে ​​একটি বুদ্ধিমান বেস স্টেটে সেট করবে।

সুতরাং, আপনি যদি কোনও গণিত কোডে একেবারে লিঙ্ক না করেন তবে এর কোনওটিই ঘটবে না, অতএব ওএসকে কোনও এফপিইউ অবস্থা মোটেও সংরক্ষণ / পুনরুদ্ধার করতে হবে না, প্রসঙ্গটি কিছুটা দক্ষ করে তোলে।

যদিও একটি অনুমান।

সম্পাদনা করুন: কিছু মন্তব্যের জবাবে, একই বেস ভিত্তিটি এখনও নন-এফপিইউ ক্ষেত্রে প্রযোজ্য (যে ভিত্তিতে এটি এমন অ্যাপ্লিকেশন তৈরি করা হয়েছিল যা লিবিম ব্যবহারটি সামান্য ভাল সম্পাদন করে না)।

উদাহরণস্বরূপ, যদি কোনও সফট-এফপিইউ থাকে যা সি এর প্রথম দিনগুলিতে লাইকলে ছিল তবে লিবম পৃথক থাকা অনেক বড় (এবং এটি ধীরে ধীরে ব্যবহৃত হলেও) কোড অকারণে সংযুক্ত হওয়া থেকে রোধ করতে পারে।

তদতিরিক্ত, যদি কেবলমাত্র স্থিতিশীল লিঙ্ক উপলব্ধ থাকে তবে একটি অনুরূপ যুক্তি প্রয়োগ করা হয় যে এটি সম্পাদনযোগ্য আকার এবং সময়কে সঙ্কলন করে।


যদি আপনি লিবিমের সাথে লিঙ্ক না করেন তবে অন্যান্য মাধ্যমে (উদাহরণস্বরূপ ফ্লোটে অপারেশন) x x এফপিইউ স্পর্শ করেন, x86 কার্নেলের এফপিইউ অবস্থা সংরক্ষণ করার প্রয়োজন নেই। আমি এটি খুব ভাল অনুমান বলে মনে করি না ...
প্রথম

অবশ্যই যদি আপনি ম্যানুয়ালি এফপিইউ ব্যবহার করেন তবে কার্নেলের এখনও তার অবস্থা সংরক্ষণ / পুনরুদ্ধার করা দরকার। আমি বলছিলাম যে আপনি যদি এটি কখনও ব্যবহার না করেন (লিবিএম ব্যবহার না করে) তবে তা করতে হবে না।
ইভান তেরান

সত্যিই এটি কার্নেলের উপর খুব নির্ভর করে। কার্নেলের দ্বারা ব্যবহৃত গণিত লাইব্রেরিতে একটি save_FPU_on_switch () ফাংশন থাকতে পারে যা এটি চালু করে, আবার অন্যরা এফপিইউ স্পর্শ করেছে কিনা তা সনাক্ত করে।
আর্লজ

1
যদি আমি সঠিকভাবে স্মরণ করি তবে পুরো ইস্যুটি দীর্ঘস্থায়ীভাবে ভাসমান পয়েন্ট ক্যাপ্রোসেসারগুলি এমনকি মাইক্রোপ্রসেসরে থাকার পূর্বাভাস দেয়।
নোসরেডনা

@earlz: গণিতের গ্রন্থাগারের অনুরোধ সংরক্ষণের পদ্ধতিটি একটি ভয়ানক নকশা হবে। তারা যদি অন্য কোনও উপায়ে এফপিইউ ব্যবহার করে তবে কী হবে? একমাত্র বুদ্ধিমান পদ্ধতির (কেবল সর্বদা সংরক্ষণ / পুনরুদ্ধার ছাড়াও) ব্যবহার সনাক্তকরণ এবং তারপরে সংরক্ষণ / পুনরুদ্ধার শুরু করা হবে।
ইভান তেরান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.