ไม่สามารถรวบรวมโปรแกรม C บน Mac หลังจากอัปเกรดเป็น Catalina 10.15


64

มีคำถามก่อนหน้านี้ไม่สามารถรวบรวมโปรแกรม C บน Mac หลังจากอัปเกรดเป็น Mojaveและคำตอบที่ครอบคลุมส่วนใหญ่ของรูปแบบที่ผิดพลาด

ตอนนี้ - ตั้งแต่วันจันทร์ที่ 2019-10-07 - คุณสามารถอัปเกรดเป็น macOS Catalina 10.15 อีกครั้งระหว่างการอัปเกรด/usr/includeไดเรกทอรีได้ถูกยกเลิกไปโดยการอัพเดตแม้ว่าจะติดตั้ง XCode 11.0 ก่อนการอัปเกรด (จาก Mojave 10.14.6) ไปยัง Catalina ดังนั้นคอมไพเลอร์ที่สร้างขึ้นเพื่อคาดหวังว่าจะมี/usr/includeไดเรกทอรีไม่ทำงานอีกต่อไป

ขั้นตอนหลักที่แนะนำสำหรับปัญหา Mojave - การใช้คำสั่ง:

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

ไม่ทำงานจากเกตเพราะ/Library/Developer/CommandLineTools/Packages/ไม่มีไดเรกทอรี(ดังนั้นยังไม่มี.pkgไฟล์ที่จะเปิด)

มีวิธีที่ดี (เป็นทางการ) ในการสร้างและเติมไดเรกทอรี/usr/includeหรือไม่


คุณไม่จำเป็นต้อง/usr/includeใช้เครื่องมือสำหรับนักพัฒนาของ Apple กับ Xcode ปัจจุบันของ Apple Xcode.app/Contents/Developer/Platforms/SomePlatform/SDKs/SomeSDKส่วนหัวและเช่นอยู่ใน (การรักษาส่วนหัวในไดเรกทอรีที่แตกต่างเป็นสิ่งที่จำเป็นเพื่อสนับสนุนแพลตฟอร์มหลายเป้าหมายและมันเป็นสิ่งที่ดีไม่ให้มี/usr/includeเพื่อให้แน่ใจว่าไม่มีการคอมไพล์ตั้งใจใช้ไฟล์จากมันเมื่อกำหนดเป้าหมายรุ่นที่แตกต่างจากระบบโฮสต์.) สิ่งที่ไม่xcode-select -pแสดงสำหรับเส้นทางไปยัง ไดเรกทอรีนักพัฒนาซอฟต์แวร์ที่ใช้งานอยู่?
Eric Postpischil

ฉันสร้าง GCC 9.2.0 (บน Mojave) และคาดว่าจะสามารถใช้/usr/includeสำหรับส่วนหัวของระบบ ฉันต้องการที่จะสามารถใช้งานได้ถึงแม้ว่าฉันสงสัยว่า Apple ได้โยนร่องรอยสุดท้ายของความเข้ากันได้กับระบบ Unix รุ่นเก่า (ในระดับหนึ่งการเขียนอยู่บนผนังด้วยระบบที่จำเป็นในการทำงานของโมฮาวี ') ในกรณีนี้ฉันอาจต้องสร้าง GCC ใหม่โดยระบุตำแหน่งปัจจุบันของส่วนหัวของระบบอย่างใด - การทุบตีด้วยตนเองสำหรับวิธีกำหนดค่า GCC
Jonathan Leffler

1
@JonathanLeffler: หลังจากอัปเดตเป็น catalina ฉันยังประสบปัญหาว่าบางไฟล์ (เช่น stdlib.h) หายไปซึ่งซอฟต์แวร์ R ใช้งานเมื่อติดตั้งแพ็คเกจ R ฉันลองแบบเดียวกับ macOS_10.14 แต่มันเป็นไปไม่ได้อีกแล้ว GCC, c ++ หรืออะไรก็ตามที่ติดตั้งใน / Library / Developer / CommandLineTools / usr / bin แต่ R ไม่รู้ ฉันควรทำอย่างไร
sebastiann

ตั้งแต่ฉันอัพเกรดเป็น Catalina หนึ่งสัปดาห์ก่อนหน้านี้ฉันกลายเป็นเหยื่อของปัญหา 'การพิมพ์สองครั้ง' ที่มีชื่อเสียงในขณะนี้บนแป้นพิมพ์ Mac ใหม่ฉันได้เปลี่ยนเป็น zsh เปลี่ยนใจและตัดสินใจเปลี่ยนกลับเป็นทุบตี และอัปเกรดเป็น bash5.0 ตอนนี้ฉันอยู่ที่นี่เพราะฉันไม่สามารถรวบรวม bash5.0 ได้ ฉันสงสัยว่าคำตอบที่ถูกต้องสำหรับปัญหานี้ไม่ใช่เพื่อลดความสูญเสียและเปลี่ยนเป็น Arch ใช่ไหม
DryLabRebel

อีกวิธีหนึ่งในการแก้ไขปัญหาคือการใช้คอมไพเลอร์ Xcode - หากพวกเขาติดตั้งพวกเขารู้ว่าจะหาส่วนหัวของระบบได้ที่ไหน เทคนิค CPATH ในคำตอบที่ยอมรับก็ดูเหมือนว่าจะใช้ได้ ฉันยังไม่ได้รับความทุกข์ทรมานจาก Mac จาก 'การพิมพ์สองครั้ง' (ที่ฉันรู้) ฉันมี iPhone ของฉันแล้วฉันตัดสินใจว่าฉันพิมพ์สิ่งที่น่าสนใจทุกประเภท แต่จนถึงตอนนี้ไม้สัมผัส MacBook Pro ของฉันก็โอเค
Jonathan Leffler

คำตอบ:


30

สำหรับฉันเพิ่มเส้นทางต่อไปนี้เพื่อCPATHแก้ไขปัญหา:

export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

ฉันพยายามเพิ่ม CPATH; อย่างไรก็ตามฉันยังคงได้รับข้อผิดพลาดเดียวกันนี้ เพียงแค่พยายามทำกาแฟอย่างง่าย << "สวัสดี";
Jon Pellant

1
เมื่อฉันลองสิ่งนี้มันทำงานในการทดสอบแบบไม่เป็นทางการกับ GCC 9.2.0 ที่สร้างขึ้นภายใต้โมฮาวีโดยใช้สิ่งที่ตอนนี้ Xcode 11.1 - ขอบคุณ
Jonathan Leffler

สิ่งนี้ใช้ได้กับฉันด้วย GCC 9.2.0_1
Sandeep

5
หากคุณใช้เครื่องมือบรรทัดคำสั่งแทน Xcode.app ให้ใช้export CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
nalzok

หนึ่งคี่ - ฉันมีรหัสที่เริ่มต้น#include <stdlib.h>แล้วไม่สามารถรวบรวมบ่นเกี่ยวกับ:In file included from …/usr/include/sys/wait.h:110, —— from …/usr/include/stdlib.h:66, —— from bm.c:27: —— …/usr/include/sys/resource.h:443:9: error: no previous prototype for ‘getiopolicy_np’ [-Werror=missing-prototypes] —— 443 | int getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);—— ยังเมื่อฉันเพิ่ม#include <ctype.h>ก่อน#include <stdlib.h>มันคอมไพล์ตกลง ยังคงทำงานเกี่ยวกับความหมายและวิธีจัดการโดยอัตโนมัติ
Jonathan Leffler

48

ก่อนที่คุณจะดำเนินการตรวจสอบให้แน่ใจว่าได้ติดตั้งเครื่องมือบรรทัดคำสั่ง xcode แล้ว

xcode-select --install

ที่จริงคุณสามารถทำได้! จริงๆแล้วส่วนหัว C ทั้งหมดจะอยู่ที่นี่ในโฟลเดอร์นี้:

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

เราเพียงแค่ต้องสร้าง symlink สำหรับไฟล์ส่วนหัวทั้งหมดลงในโฟลเดอร์นี้:

/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

ตกลงทั้งหมดที่จะไม่สนใจ นั่นคือทั้งหมดที่


1
ใช่ฉันคิดว่ามันเป็นไปได้ - ขอบคุณสำหรับคำแนะนำ ไม่ตรงกับความต้องการของฉันสำหรับ 'สุขอนามัยของระบบ' (เช่นส่วนหัวที่ซ้ำกันเหล่านั้น) และ/usr/local/ลำดับชั้นของไดเรกทอรีนั้นมีความหมายสำหรับซอฟต์แวร์ท้องถิ่นมากกว่าซอฟต์แวร์ระบบ IMO ส่วนหัวควรอยู่ใน/usr/includeและ Apple ก็เป็นเพียงความเจ็บปวด
Jonathan Leffler

1
มีวิธีการรอบอาจทำงานได้คุณสามารถลอง ในโหมดการกู้คืนปิดใช้งาน SIP จากนั้นเมาต์/ในโหมดเขียน จากนั้นเติม/usr/includeโฟลเดอร์ เป็นเพราะใน 10.15 นั้นระบบจะเมาท์เป็นโหมดอ่านอย่างเดียว โดยไม่ปิดใช้งาน SIP คุณจะไม่สามารถเมานต์ระบบไดรฟ์
Roy

@ KomolNathRoy: ขอบคุณสำหรับคำแนะนำของคุณ มันใช้งานได้ดีมากสำหรับฉัน ในที่สุดฉันก็สามารถติดตั้งแพ็กเกจที่ฉันต้องการทั้งหมดในซอฟต์แวร์สถิติ R เพราะไม่มี R พบทุกสิ่งที่จำเป็นสำหรับการติดตั้ง
sebastiann

7
วิธีนี้ใช้ได้กับฉันใน Catalina 10.15
Matthew Barbara

2
การปิดใช้งาน SIP ไม่เป็นที่ยอมรับสำหรับฉันแม้จะเป็นมาตรการชั่วคราว
Jonathan Leffler

22

TL; DR

ปรากฏว่าแอปเปิ้ลจะพิจารณา/usr/includeเป็นสิ่งที่ได้ไปทางของ dodo - มันจะสูญพันธุ์ - หรืออาจจะเป็นเหมือน Monty Python ของนกแก้ว

ใช้ GCC ที่ Apple จัดเตรียมให้ (ที่จริงแล้วนั่นคือเสียงดังกราวด้วยชื่ออื่นตามที่แสดงข้อมูลรุ่น) หรือ Clang หลีกเลี่ยงปัญหา ทั้งสอง/usr/bin/gccและ/usr/bin/clangจะค้นหาไลบรารีระบบสี่ระดับไดเรกทอรีด้านล่าง:

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

หากคุณสร้าง GCC ของคุณเองหรือคอมไพเลอร์อื่น ๆ คุณจะ (อาจ) ต้องกำหนดค่าเพื่อค้นหาไลบรารีระบบภายใต้ไดเรกทอรีแอปพลิเคชัน Xcode

Explorations

ทันทีหลังจากการอัปเกรดฉันรัน XCode 11.0 มันต้องการติดตั้งส่วนประกอบพิเศษบางอย่างดังนั้นฉันปล่อยให้มันทำ แต่ที่ไม่ได้คืนสถานะหรือไดเรกทอรีภายใต้/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เพิ่ม (ใน makefile I ที่ใช้การตั้งค่า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:

$ 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ตัวเลือก)


ขออภัยไม่สามารถทำตามคำแนะนำของคุณ ฉันได้รับข้อผิดพลาดเดียวกันกับการปรับปรุงตัวเร่งปฏิกิริยา ด้วย vscode ฉันไม่สามารถสร้างแอป C ++ และwchar.hไม่พบข้อผิดพลาด ฉันพยายามรวมโฟลเดอร์นี้ --I / Applications / Xcode.app / เนื้อหา / ผู้พัฒนา / แพลตฟอร์ม / MacOSX.platform / ผู้พัฒนา / SDKs / MacOSX.sdk / usr / รวมและฉันได้รับข้อผิดพลาดอื่น ๆ เช่นเกี่ยวกับสัญลักษณ์ที่หายไปสำหรับ "ข้อผิดพลาด: ไม่มีสมาชิก ชื่อ 'isless' ใน namespace ส่วนกลาง "
user3279954

เปิดใช้งาน--verboseในไฟล์งานและสังเกตว่า vs code กำลังดูที่/usr/include/c++/v1/โฟลเดอร์ซึ่งไม่มีอยู่ใน catalina อีกต่อไป เพิ่มโฟลเดอร์ต่อไปนี้ด้วยพร้อมกับ sdk ข้างต้นและตอนนี้ก็ใช้งานได้ "-I / Library / Developer / CommandLineTools / usr / include / c ++ / v1 /",
user3279954

@trojanfoe - ฉันชอบ SCCS แต่ในปี 1999 มันไม่ชัดเจนว่า SCCS จะทำงานได้ดีหรือไม่ Y2K (และไม่มีการใช้งานโอเพนซอร์สที่ดีของ SCCS ที่ฉันรู้จัก) ดังนั้นฉันจึงเปลี่ยนมาใช้ RCS อย่างไม่เต็มใจ
Jonathan Leffler

ว้าว: งั้นประเด็นที่/usr/includeจะหายไปคืออะไร? มันมักจะเป็นส่วนหนึ่งของคอมไพเลอร์รวมเส้นทางเพื่อให้ผู้ใช้ไม่จำเป็นต้องรู้เกี่ยวกับมัน (นอกเหนือจากเมื่อคุณพยายามที่จะหาสิ่งที่ประกาศ) เสียงดังกราวทำเช่นเดียวกันกับเส้นทาง SDK ภายใต้Xcode.appดังนั้นผลกระทบสุทธิจะเหมือนกัน
trojanfoe

1
@trojanfoe: ปัญหาหนึ่ง (ปัญหาหลักของฉัน) ที่/usr/includeหายไปจาก AWOL คือถ้าคุณสร้าง GCC ของคุณเองจากแหล่งที่มามันอาจถูกรวบรวมเพื่อค้นหาส่วนหัวของระบบ/usr/includeและดังนั้นการรวบรวมล้มเหลว ฉันต้องการใช้ GCC ล่าสุดเช่นเดียวกับเสียงดังกราว ฉันยินดีที่จะใช้ Clang ของ Apple แต่ฉันไม่พอใจที่จะใช้ Clang ของ Apple เป็น GCC - มันไม่เหมือนกับ GCC ฉันยังไม่ได้คิดสูตรสำหรับการสร้าง GCC โดยย้ายที่ส่วนหัวของระบบ (ฉันคิดว่า--with-native-system-header-dir="${XCODE_HDR}"เป็นส่วนหนึ่งของคำตอบ แต่มันไม่ใช่คำตอบทั้งหมด)
Jonathan Leffler

7

ตั้งค่าMakeตัวแปรimplicit ต่อไปนี้ให้ชี้ไปที่ส่วนหัวอยู่ในขณะนี้สำหรับเครื่องมือบรรทัดคำสั่ง 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

ใน makefiles ของฉัน (และ makefiles อื่น ๆ ส่วนใหญ่ที่ฉันเห็น) CFLAGSมีความซับซ้อนมากกว่าตัวเลือกเดียว - -isysrootตัวเลือกจะต้องเป็น 'นอกเหนือจาก' การตั้งค่าอื่น ๆ (การตั้งค่าอื่น ๆ อีกมากมาย) อาจมีเคอร์เนลของแนวคิดที่นี่ (ผ่าน-isysrootตัวเลือกและตำแหน่งใต้/Library/Developer/…) แต่จะต้องขัดเกลาก่อนที่มันจะพร้อมสำหรับช่วงเวลาไพร์มไทม์
Jonathan Leffler

@JonathanLeffler ใช้export CFLAGS+=-isysroot ...แทนจะทำงานสำหรับกรณีการใช้งานที่ นี่เป็นทางออกเดียวที่ใช้ได้สำหรับฉัน (บน Mojave (10.14) กับ Catalina (10.15) SDK ฉันไม่มี.pkgไฟล์ที่ทุกคนพูดถึงแม้ว่า XCode และเครื่องมือบรรทัดคำสั่งของฉันจะทันสมัย)
Norswap

@Norswap - มีความแตกต่างกันมากระหว่างการใช้งานและCFLAGS=… CFLAGS+=…
Jonathan Leffler

@JanathanLeffler เห็นด้วย ฉันได้อัพเดตคำตอบสำหรับการใช้งาน+=แล้ว ขอบคุณ @Norswap
โค้ต

1
หรือฉันคิดว่าการตั้งค่าSDKROOTเป็นค่า sdk เดียวกัน ( /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk) จะทำงานได้ดีสำหรับฉัน!
Norswap

4

ฉันเป็นมือใหม่ที่มีคอมไพเลอร์ C ++ สำหรับ R ใน OSX และฉันได้รับปัญหาเดียวกันกับที่ C ++ ไม่สามารถหาส่วนหัวได้หลังจากอัปเดตระบบปฏิบัติการ ( ไม่มี math.h แม้ว่ามันจะอยู่ที่นั่น ) ฉันทำตามคำแนะนำจาก https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/แต่ไม่มีอะไรเปลี่ยนแปลง

ในที่สุดมันใช้งานได้สำหรับฉันหลังจากที่ฉันติดตั้ง Xcode CLI อีกครั้ง

xcode-select --install

จากนั้นเปลี่ยนค่าสถานะเป็น Var ตามคำแนะนำ @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

1

ในกรณีของฉันฉันดูเหมือนจะมีllvmและgccติดตั้งโดยใช้ homebrew เมื่อฉันลบสิ่งเหล่านั้นออกไปและพึ่งพาอาศัยกันอย่างเต็มที่กับ macOS clang มันสามารถค้นหาส่วนหัวและการคอมไพล์ได้อีกครั้ง


0

apue.h การพึ่งพาอาศัยกันของฉันยังคงหายไป/usr/local/includeหลังจากทำตามKomol Nath Royคำตอบในคำถามนี้

ฉันดาวน์โหลดการอ้างอิงด้วยตนเองจากคอมไพล์และใส่ไว้ใน /usr/local/include


ส่วนหัวapue.hมาจาก W Richard Stevens, Stephen A Rago การเขียนโปรแกรมขั้นสูงใน Unix Environment, 3 Edn 2013 AFAIK ไม่เคยมีการจัดหาโดย Apple ในฐานะส่วนหัวของระบบ (ไม่ได้อยู่/usr/includeในเครื่องของฉันที่ยังคงเรียกใช้ Mojave) หากมีการติดตั้งครั้งเดียว/usr/includeมันอาจจะถูกสร้างขึ้นด้วยตนเองแทนที่จะได้รับจาก Apple ดังนั้นควรติดตั้ง/usr/local/includeก่อนหน้านี้
Jonathan Leffler

ขอโทษคำถามไร้เดียงสาของฉัน แต่ฉันเพิ่งได้รับใน C ++ ในสัปดาห์นี้ การพึ่งพา / ส่วนหัวมีการจัดการด้วยตนเองใน c ++ หรือไม่ ถ้าใช่ฉันควรใส่ผู้อ้างอิง / หัวต่อทั้งหมดไว้ในนั้น/usr/includeหรือไม่?
Matthew Barbara

1
Q1: มากกว่าหรือน้อยกว่า ขึ้นอยู่กับความหมายของคุณ แต่คุณต้องกังวลเกี่ยวกับการขึ้นต่อกันและส่วนหัวของ C หรือ C ++ หากส่วนหัวนั้นไม่ได้มาตรฐานบนเครื่องที่คุณใช้งาน ถ้าอย่างนั้นคำถามก็มา - มาตรฐานคืออะไร? และเกี่ยวกับคำตอบที่ดีที่สุดที่สามารถให้ได้คือ "ขึ้นอยู่กับ" และขึ้นอยู่กับปัจจัยหลายอย่างรวมถึง 'แพลตฟอร์ม' (O / S, คอมไพเลอร์) Q2 คือ "ไม่คุณไม่ควรใส่อะไรใน/usr/include" - ใช้/usr/local/includeแทน โดยทั่วไปแล้วจะปลอดภัยที่จะออกไป/usr/includeและ/usr/libอยู่คนเดียวและเพิ่มเนื้อหาไว้ใต้/usr/localแทน
Jonathan Leffler

0

การแก้ปัญหานั้นง่ายกว่าที่ฉันคิด ติดตั้งเสียงดังกราว / llvm

brew install llvm

จากนั้นเราจำเป็นต้องสร้าง symlink ของเราเอง

for f in /usr/local/Cellar/llvm/9.0.0_1/bin/clang*; do ln -s ${f} /usr/local/bin/"${f##*/}"; done

และ

ln -s /usr/local/Cellar/llvm/9.0.0_1/include/c++ /usr/local/include/c++

ขึ้นอยู่กับเวอร์ชัน llvm ของคุณให้แก้ไขคำสั่งด้านบน

ตอนนี้คุณสามารถคอมไพล์โปรแกรม C ++ ได้โดยไม่ต้องผ่านค่าสถานะที่กำหนดเอง

clang++ hello.cpp


0

สำหรับฉันมันใช้งานได้ดีดังต่อไปนี้:

1. xcode-select --install

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

3. export SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.