`পাও 'এবং' তল 'এর অপরিবর্তিত রেফারেন্স


124

আমি সিতে একটি সাধারণ ফিবোনাচি ক্যালকুলেটর তৈরি করার চেষ্টা করছি তবে সংকলন করার সময় gccআমাকে বলে যে আমি পা এবং মেঝে ফাংশনগুলি অনুপস্থিত। কোনো সমস্যা?

কোড:

#include <stdio.h>
#include <math.h>

int fibo(int n);

int main() {
        printf("Fib(4) = %d", fibo(4));
        return 0;
}

int fibo(int n) {
        double phi = 1.61803399;

        return (int)(floor((float)(pow(phi, n) / sqrt(5)) + .5f));
}

আউটপুট:

gab@testvm:~/work/c/fibo$ gcc fib.c -o fibo
/tmp/ccNSjm4q.o: In function `fibo':
fib.c:(.text+0x4a): undefined reference to `pow'
fib.c:(.text+0x68): undefined reference to `floor'
collect2: ld returned 1 exit status

ফ্লোটিং পয়েন্ট স্পষ্টতা অসীম নয়, এই তাই বড় মানের জন্য ভুল উত্তর দেবেনn
vonbrand


দেখে মনে হচ্ছে এটি আরও সহজ সমাধান রয়েছে, কেবল তার পরিবর্তে g ++ ব্যবহার করুন: g ++ fib.c -o
fibo

উত্তর:


242

আপনাকে লিঙ্কের পতাকাটি দিয়ে -lmএরকম সংকলন করতে হবে :

gcc fib.c -lm -o fibo

এটি জিসিসিকে আপনার কোডটিকে গণিতের লিবার সাথে লিঙ্ক করতে বলবে। আপনি যে বস্তুগুলিতে লিঙ্ক করতে চান তার পরে পতাকাটি অবশ্যই লাগানো নিশ্চিত করুন।


7
আপনি কি দয়া করে ব্যাখ্যা করতে পারেন কীভাবে লেটার পরে চিঠিটি ব্যবহার করবেন?
গ্যাব্রিয়েল সিরুল্লি

48
/ লিব বা / ইউএসআর / লিবিতে দেখুন। গ্রন্থাগারগুলির সমস্ত নাম দেওয়া হয়েছে lib<name>.aবা lib<name>.so- এটি "<নাম>" আপনি পরে রেখেছেন -l। এই ক্ষেত্রে, গণিতের গ্রন্থাগারটির নাম দেওয়া হয়েছে libm.so, তাই আমরা এটি কল করি -lm
এএমএস

3
ধন্যবাদ! আমি গত ৩০ মিনিট ধরে গুগল করছি এবং এটি প্রথম রেফারেন্স যা বস্তুর পরে গ্রন্থাগারগুলিকে সংযুক্ত করতে বলেছিল
ডেভ বাঘদানভ ov

প্রক্রিয়াটির মেমরি মানচিত্র এবং প্রতীক টেবিলটিতে libm.so অন্তর্ভুক্ত করতে এলডি রানটাইম লিঙ্কারকে বলতে আপনি LD_PRELOAD ব্যবহার করতে পারেন, সুতরাং এই চিহ্নগুলি লোড হয়ে যায় এবং সবকিছু প্রত্যাশা অনুযায়ী কাজ করে
ডেবিটি

উত্তর করার জন্য ধন্যবাদ. তবে কেউ কি আমাকে বলতে পারবেন যে কয়েকটি লাইনের কোডগুলির ক্ষেত্রে কেন আমি সংকলনের সময় -lm অন্তর্ভুক্ত না করে তা ঠিক আছে?
মিত্রজ্যোতি কুশারি

24

আপনার লিঙ্ক বিকল্পগুলিতে অ্যাড-এলএম যুক্ত করুন, যেহেতু পাও () এবং তল () গণিত লাইব্রেরির অংশ:

gcc fib.c -o fibo -lm

9

এটি পরবর্তীতে যে কারওরও পড়ার সুবিধার জন্য, ফ্রেড যেমন বলেছেন তার সাথে আপনার লিঙ্ক করতে হবে:

gcc fib.c -lm -o fibo

আপনার কোন লাইব্রেরিটি লিঙ্ক করতে হবে তা জানার একটি ভাল উপায় হ'ল ম্যান পৃষ্ঠাটি উপস্থিত থাকলে তা পরীক্ষা করে। উদাহরণস্বরূপ, man powএবং man floorউভয়ই আপনাকে বলবে:

সাথে লিঙ্ক -lm

সি প্রোগ্রামিংয়ে গণিত গ্রন্থাগারকে সংযুক্ত করার জন্য একটি ব্যাখ্যা - সিটিতে লিঙ্কিং


8

ফুজি দ্বারা প্রদত্ত উত্তরের বিষয়ে:

আমাকে আসলে কিছুটা আলাদা করতে হয়েছিল।

প্রকল্প -> সম্পত্তি -> সি / সি ++ বিল্ড -> সেটিংস -> জিসিসি সি লিংকার -> গ্রন্থাগারগুলি

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


6

Eclipse-IDE- এ -lm যুক্ত করার পয়েন্টটি খুঁজে পাওয়া সত্যিই ভয়াবহ, তাই এটি আমাকে কিছুটা সময় নিয়েছিল।

যদি অন্য কেউ এডলিপস ব্যবহার করেন তবে কমান্ডটি কীভাবে যুক্ত করবেন তা এখানে রয়েছে:

প্রকল্প -> বৈশিষ্ট্য -> সি / সি ++ বিল্ড -> সেটিংস -> জিসিসি সি লিংকার -> বিবিধ -> লিংক পতাকা: এই ক্ষেত্রে -lm কমান্ড যুক্ত করুন


0

উপরের সমস্ত উত্তর অসম্পূর্ণ, এখানে সমস্যা ldসংকলক না হয়ে লিঙ্কারের মধ্যে রয়েছে collect2: ld returned 1 exit status। আপনি যখন fib.cআপত্তি করতে আপনার সংকলন করছেন :

$ gcc -c fib.c
$ nm fib.o
0000000000000028 T fibo
                 U floor
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T main
                 U pow
                 U printf

যেখানে nmঅবজেক্ট ফাইল থেকে প্রতীকগুলি তালিকাবদ্ধ করে। আপনি দেখতে পারেন যে এটি একটি ত্রুটি ছাড়া কম্পাইল করা হয়েছে, কিন্তু pow, floorএবং printfফাংশন অনির্ধারিত রেফারেন্স আছে, এখন যদি আমি এক্সিকিউটেবল করতে এই লিঙ্কটি করতে চেষ্টা করবে:

$ gcc fib.o
fib.o: In function `fibo':
fib.c:(.text+0x57): undefined reference to `pow'
fib.c:(.text+0x84): undefined reference to `floor'
collect2: error: ld returned 1 exit status

আমি একইভাবে আউটপুট পাচ্ছি। এটি সমাধান করার জন্য, আমাকে লিঙ্কারটি বলতে হবে যেখানে রেফারেন্সগুলি সন্ধান করতে হবে powএবং floorএই উদ্দেশ্যে আমি লাইব্রেরি থেকে আসা লিঙ্কার -lপতাকা ব্যবহার করব ।mlibm.so

$ gcc fib.o -lm
$ nm a.out
0000000000201010 B __bss_start
0000000000201010 b completed.7697
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000201000 D __data_start
0000000000201000 W data_start
0000000000000620 t deregister_tm_clones
00000000000006b0 t __do_global_dtors_aux
0000000000200da0 t 
__do_global_dtors_aux_fini_array_entry
0000000000201008 D __dso_handle
0000000000200da8 d _DYNAMIC
0000000000201010 D _edata
0000000000201018 B _end
0000000000000722 T fibo
0000000000000804 T _fini
                 U floor@@GLIBC_2.2.5
00000000000006f0 t frame_dummy
0000000000200d98 t __frame_dummy_init_array_entry
00000000000009a4 r __FRAME_END__
0000000000200fa8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
000000000000083c r __GNU_EH_FRAME_HDR
0000000000000588 T _init
0000000000200da0 t __init_array_end
0000000000200d98 t __init_array_start
0000000000000810 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000000800 T __libc_csu_fini
0000000000000790 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
00000000000006fa T main
                 U pow@@GLIBC_2.2.5
                 U printf@@GLIBC_2.2.5
0000000000000660 t register_tm_clones
00000000000005f0 T _start
0000000000201010 D __TMC_END__

এখন আপনি দেখতে পারেন, ফাংশন pow, floorসাথে লিঙ্ক করা হয় GLIBC_2.2.5

প্যারামিটারগুলি ক্রমটিও গুরুত্বপূর্ণ, যদি না আপনার সিস্টেমটি ডিফল্টরূপে ভাগ করে নেওয়া লাইব্রেরিগুলি ব্যবহার করতে কনফিগার করা থাকে তবে আমার সিস্টেমটি হয় না, তাই যখন আমি ইস্যু করি:

$ gcc -lm fib.o
fib.o: In function `fibo':
fib.c:(.text+0x57): undefined reference to `pow'
fib.c:(.text+0x84): undefined reference to `floor'
collect2: error: ld returned 1 exit status

-lmঅবজেক্ট ফাইলের আগে ফ্ল্যাগ নোট করুন। সুতরাং উপসংহারে, -lmনিশ্চিত হতে অন্য সমস্ত পতাকা, এবং পরামিতিগুলির পরে পতাকা যুক্ত করুন ।

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