আমাকে কীভাবে আদেশগুলি প্রদর্শন করতে / জিসিসি বাধ্য করব?


276

আমি একটি সংকলন সমস্যা ডিবাগ করার চেষ্টা করছি, তবে প্রকৃত সংকলক এবং লিঙ্কার কমান্ডগুলি এটি সম্পাদন করছে তা দেখানোর জন্য আমি জিসিসি (বা এটি এটি তৈরি হয় ??) পেতে পারি না।

আমি যে আউটপুটটি দেখছি তা এখানে:

  CCLD   libvirt_parthelper
libvirt_parthelper-parthelper.o: In function `main':
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:102: undefined reference to `ped_device_get'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:116: undefined reference to `ped_disk_new'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:122: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
collect2: ld returned 1 exit status
make[3]: *** [libvirt_parthelper] Error 1

আমি যা দেখতে চাই তা এর মতো হওয়া উচিত:

$ make
gcc -Wall   -c -o main.o main.c
gcc -Wall   -c -o hello_fn.o hello_fn.c
gcc   main.o hello_fn.o   -o main

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


আপনি কি একটি মেকফিল চালাচ্ছেন, বা কেবল একটি gccআদেশ?
ব্লেন্ডার

20
ভালো দেখায় Kbuild বা Autotools আউটপুট। ব্যবহার করে দেখুন make V=1
jw

উত্তর:


275

একটি ডাকা শুষ্ক রান :

make -n

এটি কী makeকরার চেষ্টা করছে তা প্রদর্শিত হবে।


30
এটি পাওয়া গেছে :) Make V = 1 যদিও "মেক-এন" এর উপরের পরামর্শটিও কাজ করেছে। :) আপনার প্রতিক্রিয়া জন্য আপনাকে ধন্যবাদ।
hernejj

75
পার্থক্য হ'ল make -nকমান্ডগুলি কার্যকর করে না। সুতরাং সঠিক উত্তরটি হলmake V=1
এম-রিচ

19
make V=1মেকফিল এটি সমর্থন করে তবেই কাজ করছে। অটোমেকের মেকফিলগুলি এটি করে তবে আরও অনেকে তা করেন না।
লার্স

53
সিএমকে জন্য, ব্যবহার করুন make VERBOSE=1; জিএনইউ অটোটুলগুলির জন্য make V=1
Ruslan

10
@ M-রিক যদি আপনি আসলে রান কমান্ড চালাতে চান বিবেচনা make SHELL='sh -x': stackoverflow.com/a/32010960/895245
সিরো Santilli郝海东冠状病六四事件法轮功

175

লাইব্রেরি মেকফিলগুলি, যা অটোটুলগুলি দ্বারা উত্পাদিত হয় (আপনার ./configureইস্যু করতে হবে) প্রায়শই একটি ভার্বোস বিকল্প থাকে, তাই মূলত, আপনাকে সম্পূর্ণ কমান্ডগুলি ব্যবহার করে make VERBOSE=1বা দেওয়া make V=1উচিত।

তবে এটি কীভাবে মেকফিল তৈরি হয়েছিল তার উপর নির্ভর করে।

-dবিকল্প সাহায্য করতে পারে, তবে এটি আপনাকে একটি অত্যন্ত দীর্ঘ আউটপুট দিতে হবে।


60
দ্রষ্টব্য: সিএমকে-উত্পাদিত মেকফিলগুলি কেবল সমর্থন করে VERBOSE=1, নয় V=1
blinry

3
ভি = 1 আমার জন্য কাজ করেছে, মিটস-লিনাক্স-গনু-জিসিসি সহ নেটটেক্স সংকলন, আপনাকে ধন্যবাদ।
jcomeau_ictx

141

সিস্টেমের স্বাধীন পদ্ধতি তৈরি করুন

make SHELL='sh -x'

অন্য বিকল্প। নমুনা Makefile:

a:
    @echo a

আউটপুট:

+ echo a
a

এটি এর SHELLজন্য বিশেষ ভেরিয়েবল সেট করে makeএবং এটি কার্যকর করার আগে প্রসারিত রেখাটি প্রিন্ট করতে -xবলে sh

একটি সুবিধা -nহ'ল আসলে কমান্ডগুলি চালানো। আমি খুঁজে পেয়েছি যে কিছু প্রকল্পের জন্য (যেমন লিনাক্স কার্নেল) যা -nনির্ভরতা সমস্যার কারণে সম্ভবত স্বাভাবিকের চেয়ে অনেক আগে চালানো বন্ধ করে দিতে পারে।

এই পদ্ধতির একটি নেতিবাচক দিকটি আপনাকে নিশ্চিত করতে হবে যে ব্যবহৃত শেলটি shহ'ল এটি মেক হিসাবে ব্যবহৃত ডিফল্ট যা তারা পসিক্স হিসাবে ব্যবহার করে তবে SHELLমেক ভেরিয়েবলের সাহায্যে এটি পরিবর্তন করা যেতে পারে ।

এরকম sh -vশীতল পাশাপাশি হতে পারে, কিন্তু ড্যাশ 0.5.7 (উবুন্টু 14.04 sh) এর জন্য উপেক্ষা করে -cকমান্ড (কীভাবে হবে বলে মনে হয় make, তাই এটি কিছু না এটি ব্যবহার করে)।

make -p এছাড়াও আপনার আগ্রহী হবে, যা সেট ভেরিয়েবলের মান মুদ্রণ করে।

সিএমকে মেকফাইল তৈরি করেছে

make VERBOSE=1

দেখুন: জিএনইউ মেকের সাথে সিএমকে ব্যবহার করুন: আমি সঠিক আদেশগুলি কীভাবে দেখতে পারি?


11
অবশ্যই সেরা উত্তর যা মূল
মেকফিলটি

2
যদি কেউ ডাউনওয়েটটি ব্যাখ্যা করতে পারে তবে আমাকে জানতে দিন যাতে আমি তথ্যটি শিখতে ও উন্নত করতে পারি ;-)
সিরো সান্তিলি 21 冠状 病 六四 六四 事件

মেক আক্ষরিক করা SHELL='$$SHELL -x'হবে $SHELLযা মূল্যায়ন করা হয় না। ব্যবহার make SHELL="$SHELL -x"কাজ করবে।
রিক ভ্যান ডার জুয়েট

1
এটি সেরা জেনেরিক উত্তর, অন্য কিছু উত্তরগুলির বিপরীতে যা চতুর ব্যবহারের উপর নির্ভর করে না
মাইক Nov76

2
SHELL = 'sh -x' তৈরি করুন সুপার!
জ্যাকি ইয়ে

22

জিএনইউ মেক ভার্সন ৪.০ করার কারণে --traceআর্গুমেন্টটি কোনও মেকফিল কী করে এবং কী করে তা জানানোর একটি দুর্দান্ত উপায়, লাইনগুলি আউটপুট দেয়:

makefile:8: target 'foo.o' does not exist

অথবা

makefile:12: update target 'foo' due to: bar

1
এই যুক্তিটি শুকনো রানের চেয়ে আরও বিশদ তথ্য মুদ্রণ করে। সিস্টেমগুলি তৈরির বিষয়টি বুঝতে খুব সহায়ক যেগুলিতে dpdk এর মতো জটিল বিল্ড প্রক্রিয়া রয়েছে।
মেকেরজ

19

ব্যবহার make V=1

অন্যান্য পরামর্শ এখানে:

  • make VERBOSE=1 - আমার পরীক্ষাগুলি থেকে কমপক্ষে কাজ করে নি।
  • make -n- কেবলমাত্র যৌক্তিক অপারেশন প্রদর্শন করে, কমান্ড লাইন কার্যকর করা হয় না। যেমনCC source.cpp

  • make --debug=j - পাশাপাশি কাজ করে, তবে একাধিক থ্রেডযুক্ত বিল্ডিং সক্ষম করতে পারে, ফলে অতিরিক্ত আউটপুট তৈরি করে।


4
make VERBOSE=1সিএমকে জন্য। আপনার ট্রায়ালগুলি সম্ভবত জিএনইউ অটোটুল-ভিত্তিক প্রকল্পগুলির সাথে ছিল।
রুসলান

12

আমি ব্যবহার করতে চাই:

make --debug=j

এটি যে আদেশগুলি কার্যকর করে তা দেখায়:

https://linux.die.net/man/1/make

--debug [= পতাকা]

সাধারণ প্রক্রিয়াজাতকরণ ছাড়াও ডিবাগিংয়ের তথ্য মুদ্রণ করুন। যদি FLAGS বাদ দেওয়া হয়, তবে আচরণটি -dসুনির্দিষ্টভাবে যেমন নির্দিষ্ট করা হয়েছিল। FLAGS হ'ল সমস্ত ডিবাগিং আউটপুট (ব্যবহারের মতোই -d), bমৌলিক ডিবাগিংয়ের vজন্য, আরও ভার্বোজ বেসিক ডিবাগিংয়ের iজন্য , অন্তর্নিহিত বিধি প্রদর্শন করার jজন্য, আদেশের অনুরোধের বিষয়ে বিশদ বিবরণী এবং mমেকফিলগুলি পুনরায় তৈরি করার সময় ডিবাগিংয়ের জন্য হতে পারে।


7

আপনার অটোমেক সংস্করণ অনুসারে আপনি এটি ব্যবহার করতে পারেন:

make AM_DEFAULT_VERBOSITY=1

রেফারেন্স: AM_DEFAULT_VERBOSITY

দ্রষ্টব্য: যেহেতু V=1আমার পক্ষে কাজ করে নি আমি এই উত্তরটি যুক্ত করেছি।

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