c - कैटालिना 10.15 में अपग्रेड करने के बाद मैक पर सी प्रोग्राम संकलित नहीं कर सकते




xcode macos (5)

टी एल; डॉ

ऐसा प्रतीत होता है कि Apple समझता है /usr/include कुछ ऐसा /usr/include है जो डोडो के रास्ते चला गया है - यह विलुप्त है - या शायद यह मोंटी पाइथन के Parrot की तरह है।

Apple द्वारा प्रदान की गई GCC का उपयोग करना (वास्तव में, यह किसी अन्य नाम से क्लैंग है, जैसा कि संस्करण जानकारी दिखाता है) या क्लैंग समस्याओं से बचा जाता है। दोनों /usr/bin/gcc और /usr/bin/clang सिस्टम लाइब्रेरी को चार निर्देशिका स्तर नीचे पाएंगे:

/Applications/Xcode.app/Contents/Developer/Platforms/…

यदि आप अपना स्वयं का जीसीसी या अन्य संकलक बनाते हैं, तो आपको (शायद) Xcode निर्देशिका निर्देशिका के तहत सिस्टम लाइब्रेरी खोजने के लिए इसे कॉन्फ़िगर करने की आवश्यकता होगी।

एक्सप्लोरेशन

उन्नयन के तुरंत बाद, मैंने XCode 11.0 चलाया। यह कुछ अतिरिक्त घटकों को स्थापित करना चाहता था, इसलिए मैंने इसे ऐसा करने दिया। हालाँकि, इसने /usr/include नहीं किया /usr/include या निर्देशिका को /Library अंतर्गत किया।

पिछले प्रश्न में सलाह के अन्य बिट्स में से एक था:

xcode-select --install

ऐसा करते समय, यह दावा किया गया कि इसने कमांड लाइन उपयोगिताओं को डाउनलोड किया, और यह सुनिश्चित किया कि /usr/bin/gcc और /usr/bin/clang आदि मौजूद थे। यह एक उपयोगी कदम है (हालांकि मैं निश्चित रूप से जाँच नहीं करता था कि वे पहले मौजूद थे)।

$ /usr/bin/gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.8)
Target: x86_64-apple-darwin19.0.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$

/usr/bin/gcc का उपयोग करना, अब कार्यक्रमों को संकलित करना संभव है:

$ make CC=/usr/bin/gcc al
co  RCS/al.c,v al.c
RCS/al.c,v  -->  al.c
revision 1.7
done
/usr/bin/gcc -I/Users/jleffler/inc -g -O3 -std=c11 -pedantic -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith  -Wold-style-definition -Wcast-qual -Wstrict-prototypes -DHAVE_MEMMEM -DHAVE_STRNDUP -DHAVE_STRNLEN  -DHAVE_GETDELIM   -o al al.c -L/Users/jleffler/lib/64  -ljl
$

हालाँकि, /usr/include अभी भी गायब है। अब /Library तहत एक निर्देशिका है:

$ ls /Library/Developer
CommandLineTools  PrivateFrameworks
$ ls /Library/Developer/CommandLineTools
Library SDKs    usr
$ ls /Library/Developer/CommandLineTools/SDKs
MacOSX.sdk      MacOSX10.14.sdk MacOSX10.15.sdk
$ ls /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/
Entitlements.plist SDKSettings.json   System
Library            SDKSettings.plist  usr
$

न तो System और न ही Library डायरेक्टरी में कुछ भी बहुत आशाजनक है।

जब बाकी सब विफल हो जाए, तो मैनुअल पढ़ें

अगला चरण - रिलीज़ नोट्स खोजें और पढ़ें:

इसमें कोई जानकारी नहीं है जो इससे संबंधित है। तो, संभावना है (AFAICS, केवल एक या दो घंटे के प्रयास के बाद) कि Apple अब समर्थन /usr/include नहीं करता है - हालाँकि यह अभी भी पूरी तरह से भरी हुई /usr/lib (कोई /lib ) नहीं है।

GCC विकल्प के साथ एक और संकलन की जाँच करने का समय -v जोड़ा ( UFLAGS मैंने इस्तेमाल किया, UFLAGS सेटिंग C कंपाइलर कमांड लाइन में विकल्प जोड़ता है):

$ make UFLAGS=-v CC=/usr/bin/gcc ww
co  RCS/ww.c,v ww.c
RCS/ww.c,v  -->  ww.c
revision 4.9
done
/usr/bin/gcc -I/Users/jleffler/inc -g -O3 -std=c11 -pedantic -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith  -Wold-style-definition -Wcast-qual -Wstrict-prototypes -DHAVE_MEMMEM -DHAVE_STRNDUP -DHAVE_STRNLEN  -DHAVE_GETDELIM -v  -o ww ww.c -L/Users/jleffler/lib/64  -ljl
Apple clang version 11.0.0 (clang-1100.0.33.8)
Target: x86_64-apple-darwin19.0.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.15.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -disable-free -disable-llvm-verifier -discard-value-names -main-file-name ww.c -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-strict-return -masm-verbose -munwind-tables -target-sdk-version=10.15 -target-cpu penryn -dwarf-column-info -debug-info-kind=standalone -dwarf-version=4 -debugger-tuning=lldb -ggnu-pubnames -target-linker-version 512.4 -v -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -I /Users/jleffler/inc -D HAVE_MEMMEM -D HAVE_STRNDUP -D HAVE_STRNLEN -D HAVE_GETDELIM -I/usr/local/include -O3 -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith -Wold-style-definition -Wcast-qual -Wstrict-prototypes -Wno-framework-include-private-from-public -Wno-atimport-in-framework-header -Wno-extra-semi-stmt -Wno-quoted-include-in-framework-header -pedantic -std=c11 -fdebug-compilation-dir /Users/jleffler/src/cmd -ferror-limit 19 -fmessage-length 110 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fobjc-runtime=macosx-10.15.0 -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp -o /var/folders/77/zx9nk6dn7_dg4xd4stvt42v00000gn/T/ww-4cb85b.o -x c ww.c
clang -cc1 version 11.0.0 (clang-1100.0.33.8) default target x86_64-apple-darwin19.0.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
 /Users/jleffler/inc
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.15.0 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -o ww -L/Users/jleffler/lib/64 /var/folders/77/zx9nk6dn7_dg4xd4stvt42v00000gn/T/ww-4cb85b.o -ljl -L/usr/local/lib -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/lib/darwin/libclang_rt.osx.a
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil" -o ww.dSYM ww
$

डेटा के उस बर्फ़ीले तूफ़ान में मुख्य जानकारी है:

-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk

यह प्रभावी रूप से संकलन के लिए 'रूट' निर्देशिका है, इसलिए usr और usr/include लिए उप-निर्देशिका होनी चाहिए usr/include :

$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
Entitlements.plist SDKSettings.json   System
Library            SDKSettings.plist  usr
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr
bin     include lib     libexec share
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
AppleTextureEncoder.h  dns_util.h             memory.h               simd
AssertMacros.h         dtrace.h               menu.h                 slapi-plugin.h
Availability.h         editline               miscfs                 spawn.h
AvailabilityInternal.h err.h                  module.modulemap       sqlite3.h
AvailabilityMacros.h   errno.h                monetary.h             sqlite3ext.h
AvailabilityVersions.h eti.h                  monitor.h              stab.h
lots more lines
dirent.h               mach-o                 security               xcselect.h
disktab.h              mach_debug             semaphore.h            xlocale
dispatch               machine                servers                xlocale.h
dlfcn.h                malloc                 setjmp.h               xpc
dns.h                  math.h                 sgtty.h                zconf.h
dns_sd.h               membership.h           signal.h               zlib.h
$

इससे पता चलता है कि मील-लंबी और पूरी तरह से अनमोल निर्देशिका नाम में मानक C और POSIX हेडर, साथ ही Apple-विशिष्ट एक्स्ट्रा कलाकार शामिल हैं।

पिछला /usr/local/ निर्देशिका अक्षुण्ण प्रतीत होता है; usr/local/include बारे में चेतावनी -isysrootdir अंतर्गत मौजूद नहीं है हानिरहित (और -v विकल्प के बिना दिखाई नहीं देता है)।

Mojave में अपग्रेड करने के बाद मैक पर C प्रोग्राम संकलित करने का पिछला सवाल नहीं हो सकता है , और जो उत्तर दिए गए हैं उनमें से अधिकांश बदलावों को गलत बताया गया है।

अब - सोमवार 2019-10-07 तक - आप macOS Catalina 10.15 में अपग्रेड कर सकते हैं। एक बार फिर, उन्नयन के दौरान, /usr/include निर्देशिका को अपडेट से उड़ा दिया गया है, भले ही XCode 11.0 को अपग्रेड करने से पहले (Mojave 10.14.6 से) कैटालिना में स्थापित किया गया था। नतीजतन, उम्मीद करने के लिए बनाए गए कंपाइलर में /usr/include डायरेक्टरी है जो अब काम नहीं करता है।

Mojave मुद्दों के लिए मुख्य अनुशंसित कदम - कमांड का उपयोग करना:

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

गेट से बाहर काम नहीं करता है क्योंकि निर्देशिका /Library/Developer/CommandLineTools/Packages/ मौजूद नहीं है (इसलिए अभी तक .pkg फ़ाइल को खोलने के लिए नहीं है)।

क्या निर्देशिका /usr/include करने और बनाने के लिए एक अच्छा (आधिकारिक) तरीका है?


आगे बढ़ने से पहले, सुनिश्चित करें कि xcode कमांड लाइन टूल स्थापित करें।

xcode-select --install

वास्तव में, आप यह कर सकते हैं! वास्तव में सभी C हेडर यहाँ इस फ़ोल्डर में पाए जाते हैं:

/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/

हमें इस फ़ोल्डर में सभी हेडर फ़ाइल के लिए सिम्बल बनाने की आवश्यकता है:

/usr/local/include/

यह मेरे लिए काम किया! निम्नलिखित कमांड लाइन सभी समस्याओं का ध्यान रखेगी:

sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/

आपको थोड़ी चेतावनी मिलेगी। कुछ शीर्ष लेख पहले से मौजूद हैं, जैसे:

ln: /usr/local/include//tcl.h: File exists
ln: /usr/local/include//tclDecls.h: File exists
ln: /usr/local/include//tclPlatDecls.h: File exists
ln: /usr/local/include//tclTomMath.h: File exists
ln: /usr/local/include//tclTomMathDecls.h: File exists
ln: /usr/local/include//tk.h: File exists
ln: /usr/local/include//tkDecls.h: File exists
ln: /usr/local/include//tkPlatDecls.h: File exists

पूरी तरह से नजरअंदाज करना ठीक है। बस इतना ही।


निम्नलिखित संकेत सेट Make चर को इंगित करें जहां हेडर अब Xcode कमांड लाइन टूल्स (Xcode CLI) के लिए स्थित हैं:

export CFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CCFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CXXFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CPPFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk

-isysroot विकल्प रूट फ़ाइलों की स्थिति को सिस्टम रूट निर्देशिका / से दूर अद्यतन करता है।

तो, यह सुनिश्चित करता है कि आम /usr/* फाइलें अपने नए स्थान पर पाई जाती हैं।

यही है, अब /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk पर फाइलें मिलती हैं। ये फाइलें हैं:

Entitlements.plist 
Library
SDKSettings.json
SDKSettings.plist
System
usr

मेरे मामले में मैं llvm और gcc भी homebrew का उपयोग कर स्थापित किया था लग रहा था। जब मैंने उन को हटा दिया, और इस तरह पूरी तरह से मैकओएस क्लैंग पर भरोसा किया, तो यह हेडर पा सकता था और संकलन फिर से काम कर सकता था।


मैं OSX में R के लिए C ++ कंपाइलर के साथ एक नौसिखिया हूं और मुझे एक ही मुद्दा मिला कि OS अपडेट होने के बाद C ++ को हेडर नहीं मिल सकता था ( math.h याद आ रहा था, हालांकि )। मैंने https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/ से निर्देशों का पालन किया, लेकिन कुछ भी नहीं बदला।

आखिरकार, मैंने Xcode CLI को फिर से स्थापित करने के बाद मेरे लिए काम किया

xcode-select --install

और फिर झंडे को बदलकर वार को @Coatless के रूप में सुझाया गया:

export CFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CCFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CXXFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CPPFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk






macos-catalina