TL; DR
Dường như Apple coi /usr/include
như một thứ gì đó đã đi theo con đường của dodo - nó đã tuyệt chủng - hoặc có thể giống như Parrot của Monty Python .
Sử dụng GCC do Apple cung cấp (thực ra, đó là Clang theo bất kỳ tên nào khác, như thông tin phiên bản cho thấy) hoặc Clang tránh được các vấn đề. Cả hai /usr/bin/gcc
và /usr/bin/clang
sẽ tìm thấy các thư viện hệ thống bốn cấp thư mục dưới đây:
/Applications/Xcode.app/Contents/Developer/Platforms/…
Nếu bạn xây dựng GCC của riêng mình hoặc trình biên dịch khác, có lẽ bạn sẽ cần phải cấu hình nó để tìm các thư viện hệ thống trong thư mục ứng dụng Xcode.
Thăm dò
Ngay sau khi nâng cấp, tôi đã chạy XCode 11.0. Nó muốn cài đặt thêm một số thành phần, vì vậy tôi để nó làm như vậy. Tuy nhiên, điều đó đã không phục hồi /usr/include
hoặc thư mục dưới /Library
.
Một trong những lời khuyên khác trong câu hỏi trước là chạy:
xcode-select --install
Khi làm như vậy, nó tuyên bố rằng nó đã tải xuống các tiện ích dòng lệnh và nó đảm bảo rằng /usr/bin/gcc
và /usr/bin/clang
vv đã có mặt. Đó là một bước hữu ích (mặc dù tôi không kiểm tra chắc chắn liệu chúng có mặt trước đó không).
$ /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
$
Sử dụng /usr/bin/gcc
, giờ đây có thể biên dịch chương trình:
$ 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
$
Tuy nhiên, /usr/include
vẫn còn thiếu. Hiện tại có một thư mục /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
$
Cả thư mục System
lẫn Library
thư mục đều không có gì hứa hẹn.
Khi vẫn thất bại, đọc hướng dẫn
Bước tiếp theo - tìm và đọc ghi chú phát hành:
Không có thông tin trong đó liên quan đến điều này. Vì vậy, xác suất là (AFAICS, chỉ sau một hoặc hai giờ nỗ lực) mà Apple không còn hỗ trợ nữa /usr/include
- mặc dù nó vẫn có đầy đủ /usr/lib
(không/lib
mặc dù vậy).
Thời gian để kiểm tra một trình biên dịch khác với tùy chọn GCC -v
được thêm vào (trong tệp tạo tệp tôi đã sử dụng, cài đặt UFLAGS
thêm tùy chọn vào dòng lệnh của trình biên dịch 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
$
Thông tin chính trong trận bão dữ liệu đó là:
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
Đó thực sự là thư mục 'root' để biên dịch, vì vậy cần có các thư mục con bên dưới cho usr
và 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
$
Điều này cho thấy tên thư mục dài hàng dặm và hoàn toàn không đáng tin cậy có chứa các tiêu đề C và POSIX tiêu chuẩn, cộng với các tính năng bổ sung dành riêng cho Apple.
Thư mục trước đó /usr/local/
dường như còn nguyên vẹn; cảnh báo về việc usr/local/include
không tồn tại theo -isysrootdir
là vô hại (và không thể nhìn thấy mà không có -v
tùy chọn).
/usr/include
sử dụng các công cụ dành cho nhà phát triển của Apple với Xcode hiện tại của Apple. Các tiêu đề và như vậy là trongXcode.app/Contents/Developer/Platforms/SomePlatform/SDKs/SomeSDK
. (Giữ tiêu đề trong thư mục khác nhau là cần thiết để hỗ trợ nhiều nền tảng mục tiêu, và nó là tốt không có một/usr/include
để đảm bảo rằng không có biên dịch vô tình sử dụng tập tin từ nó khi nhắm mục tiêu một khác nhau phiên bản từ hệ thống máy chủ.) Gìxcode-select -p
hiển thị cho các đường dẫn đến thư mục nhà phát triển hoạt động?