मुझे कमांड दिखाने के लिए मैं / GCC को कैसे बाध्य करूं?


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कमांड कैसे प्रदर्शित किया गया है। उपरोक्त उदाहरण केवल "CCLD libvirt_parthelper" जैसी चीजों को दिखाता है। मुझे यकीन नहीं है कि इस व्यवहार को कैसे नियंत्रित किया जाए।


क्या आप एक मेकफाइल, या सिर्फ एक gccकमांड चला रहे हैं ?
ब्लेंडर

20
यह Kilt या Autotools आउटपुट की तरह दिखता है । कोशिश करो make V=1
jww

जवाबों:


275

एक आह्वान करने के लिए सूखी रन :

make -n

यह दिखाएगा कि क्या करने makeका प्रयास किया जा रहा है।


30
मिला :) :) V = 1 हालांकि "Make -n" के उपरोक्त सुझाव ने भी काम किया। :) आपकी प्रतिक्रियाओं के लिए आप सभी को धन्यवाद।
हर्नजज

75
अंतर यह है कि make -nकमांड निष्पादित नहीं करता है। इस प्रकार सही उत्तर हैmake V=1
m-ric

19
make V=1केवल तभी काम कर रहा है जब मेकफाइल इसका समर्थन करता है। ऑटोमेक के मेकफाइल्स ऐसा करते हैं, लेकिन कई अन्य नहीं करते हैं।
लार्सर

53
CMake के लिए, उपयोग करें make VERBOSE=1; GNU ऑटोटॉल्स के लिए make V=1
रुस्लान

10
@ m-ric यदि आप वास्तव में कमांड चलाना चाहते हैं, तो विचार करें make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Ciro Santilli 郝海东 if if if 法轮功

175

लाइब्रेरी मेकफाइल्स, जो ऑटोटूलस ( ./configureआपको जारी करना होता है) द्वारा उत्पन्न होते हैं, अक्सर एक क्रिया विकल्प होता है, इसलिए मूल रूप से, का उपयोग करके make VERBOSE=1या make V=1आपको पूर्ण आदेश देना चाहिए।

लेकिन यह इस बात पर निर्भर करता है कि मेकफाइल कैसे उत्पन्न हुआ।

-dविकल्प मदद कर सकता है, लेकिन यह आप को एक लंबी उत्पादन दे देंगे।


60
नोट: CMake- जनरेटेड मेकफाइल्स केवल समर्थन करते हैं VERBOSE=1, नहीं V=1
ब्लिनरी

3
V = 1 ने मेरे लिए काम किया, मिक्स-लिनुक्स-ग्नू-जीसीसी के साथ न्यूटैक्स का संकलन, धन्यवाद।
jcomeau_ictx

141

निर्माण प्रणाली स्वतंत्र विधि

make SHELL='sh -x'

एक और विकल्प है। नमूना Makefile:

a:
    @echo a

आउटपुट:

+ echo a
a

यह विशेष SHELLचर के लिए सेट करता है make, और इसे निष्पादित करने से पहले विस्तारित रेखा को प्रिंट करने के लिए -xकहता shहै।

एक फायदा -nयह है कि यह वास्तव में कमांड चलाता है। मैंने पाया है कि कुछ परियोजनाओं (जैसे लिनक्स कर्नेल) -nके लिए निर्भरता की समस्याओं के कारण सामान्य से बहुत पहले चलना बंद हो सकता है।

इस पद्धति का एक पहलू यह है कि आपको यह सुनिश्चित करना होगा कि जो शेल उपयोग किया जाएगा sh, वह डिफ़ॉल्ट है जो मेक द्वारा उपयोग किया गया है जैसा कि वे POSIX हैं, लेकिन SHELLमेक चर के साथ बदला जा सकता है ।

ऐसा करने से sh -vयह ठंडा हो जाएगा, लेकिन डैश 0.5.7 (Ubuntu 14.04 sh) -cकमांड्स के लिए अनदेखा करता है (जो लगता है कि makeयह कैसे उपयोग करता है) इसलिए यह कुछ भी नहीं करता है।

make -p आपको ब्याज भी देगा, जो सेट चर के मूल्यों को प्रिंट करता है।

CMake ने मेकफाइल्स उत्पन्न किया

make VERBOSE=1

देखें: GNU मेक के साथ CMake का उपयोग करना: मैं सटीक कमांड कैसे देख सकता हूं?


11
निश्चित रूप से सबसे अच्छा उत्तर जो इस बात पर निर्भर नहीं करता है कि मूल
मेकफाइल

2
किसी को भी downvote की व्याख्या कर सकते हैं, तो मुझे बताएं ताकि मैं जानने के लिए और जानकारी सुधार कर सकते हैं ;-) जाने
सिरो Santilli郝海东冠状病六四事件法轮功

make शाब्दिक SHELL='$$SHELL -x'होगा $SHELLजिसका मूल्यांकन नहीं किया गया है। का उपयोग करते हुए make SHELL="$SHELL -x"काम करेंगे।
रिक वैन डेर ज़्वेट

1
यह सबसे अच्छा जेनेरिक उत्तर है, कुछ अन्य उत्तरों के विपरीत यह सेमीक का उपयोग करने पर निर्भर नहीं करता है
माइक76

2
सुपर = 'श-एक्स' बनाना सुपर है!
जैकी ये

22

GNU मेक 4.0 संस्करण के बाद से, --traceतर्क यह बताने का एक अच्छा तरीका है कि क्या और क्यों एक मेकफाइल करते हैं, जैसे आउटपुट लाइनें:

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

या

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

1
यह तर्क शुष्क रन की तुलना में अधिक विस्तृत जानकारी छापता है। यह उन प्रणालियों को समझने में बहुत मददगार है, जिनमें डीपीडी जैसी जटिल निर्माण प्रक्रिया है।
मेकरज

19

उपयोग make V=1

यहाँ अन्य सुझाव:

  • make VERBOSE=1 - कम से कम मेरे ट्रायल से काम नहीं चला।
  • make -n- केवल तार्किक ऑपरेशन प्रदर्शित करता है, कमांड लाइन निष्पादित नहीं किया जा रहा है। उदाहरण के लिएCC source.cpp

  • make --debug=j - साथ ही काम करता है, लेकिन अतिरिक्त उत्पादन के कारण बहु थ्रेडेड बिल्डिंग को भी सक्षम कर सकता है।


4
make VERBOSE=1CMake के लिए है। आपके परीक्षण GNU ऑटोटूलस-आधारित परियोजनाओं के साथ सबसे अधिक संभावना थे।
रुस्लान

12

मुझे उपयोग करना पसंद है:

make --debug=j

यह उन कमांड को दिखाता है जो इसे निष्पादित करता है:

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

--debug [= FLAGS]

सामान्य प्रसंस्करण के अलावा डिबगिंग जानकारी प्रिंट करें। यदि FLAGS को छोड़ दिया जाता है, तो व्यवहार वही है जैसे कि -dनिर्दिष्ट किया गया था। FLAGS सभी डिबगिंग आउटपुट (समान उपयोग के लिए -d), bमूल डीबगिंग के लिए, vअधिक क्रिया मूल डीबगिंग के लिए, iअंतर्निहित नियम दिखाने के jलिए , आदेशों के आह्वान पर विवरण केm लिए और डीबगिंग के दौरान डीबगिंग के लिए हो सकता है।


7

अपने स्वचालित संस्करण के आधार पर, आप इसका उपयोग भी कर सकते हैं:

make AM_DEFAULT_VERBOSITY=1

संदर्भ: AM_DEFAULT_VERBOSITY

नोट: मैंने यह जवाब इसलिए जोड़ा क्योंकि V=1मेरे लिए काम नहीं किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.