Không thể biên dịch chương trình C trên máy Mac sau khi nâng cấp lên Catalina 10.15


64

Có một câu hỏi trước Không thể biên dịch chương trình C trên máy Mac sau khi nâng cấp lên Mojave và các câu trả lời đã bao gồm hầu hết các biến thể về những gì sai.

Bây giờ - kể từ Thứ Hai 2019-10-07 - bạn có thể nâng cấp lên macOS Catalina 10.15. Một lần nữa, trong quá trình nâng cấp, /usr/includethư mục đã bị thổi bay bởi bản cập nhật, mặc dù XCode 11.0 đã được cài đặt trước khi nâng cấp (từ Mojave 10.14.6) lên Catalina. Do đó, trình biên dịch được xây dựng để mong đợi rằng có một /usr/includethư mục không hoạt động nữa.

Bước chính được đề xuất cho các vấn đề Mojave - sử dụng lệnh:

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

không hoạt động ngoài cổng vì thư mục /Library/Developer/CommandLineTools/Packages/không tồn tại (vì vậy vẫn chưa có .pkgtệp để mở).

Có cách nào tốt (chính thức) để tạo và điền vào thư mục /usr/includekhông?


Bạn không cần /usr/includesử 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à trong Xcode.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 -phiển thị cho các đường dẫn đến thư mục nhà phát triển hoạt động?
Eric Postpischil

Tôi đã xây dựng GCC 9.2.0 (trên Mojave) và nó hy vọng có thể sử dụng /usr/includecho các tiêu đề hệ thống. Tôi muốn có thể sử dụng nó, mặc dù tôi nghi ngờ rằng Apple cuối cùng đã vứt bỏ những dấu tích tương thích cuối cùng với các hệ thống Unix kế thừa (ở một mức độ nào đó, chữ viết trên tường với hệ thống cần thiết để Mojave hoạt động '). Trong trường hợp đó, tôi có lẽ phải xây dựng lại GCC chỉ định vị trí hiện tại của các tiêu đề hệ thống bằng cách nào đó - bashing thủ công để biết cách định cấu hình GCC.
Jonathan Leffler

1
@JonathanLeffler: Sau khi cập nhật lên catalina, tôi cũng gặp phải vấn đề là một số tệp (như stdlib.h) bị thiếu được sử dụng bởi gói phần mềm R khi cài đặt gói R. Tôi đã thử giống như bạn cho macOS_10,14, nhưng điều này là không thể nữa. GCC, c ++ hoặc bất cứ thứ gì được cài đặt trong / Library / Developer / CommandLineTools / usr / bin, nhưng R không biết. Tôi có thể làm gì?
sebastiann

Kể từ khi tôi nâng cấp lên Catalina cách đây một tuần, tôi đã trở thành nạn nhân của vấn đề 'gõ hai lần' khét tiếng trên bàn phím Mac mới, tôi đã chuyển sang zsh, thay đổi ý định và quyết định quay lại bash và nâng cấp lên bash5.0, bây giờ tôi ở đây vì tôi không thể biên dịch bash5.0. Tôi tự hỏi nếu câu trả lời chính xác cho vấn đề này không chỉ là cắt lỗ của tôi và chuyển sang Arch?
DryLabRebel

Một cách giải quyết vấn đề là sử dụng trình biên dịch Xcode - nếu chúng được cài đặt, chúng sẽ biết nơi tìm các tiêu đề hệ thống. Kỹ thuật CPATH trong câu trả lời được chấp nhận cũng có vẻ hoạt động tốt. Tôi chưa bị Mac trên 'gõ hai lần' (mà tôi biết). Tôi đã có iPhone của mình quyết định Tôi đã gõ tất cả các loại công cụ thú vị, nhưng cho đến nay, chạm gỗ, MacBook Pro của tôi vẫn ổn.
Jonathan Leffler

Câu trả lời:


30

Đối với tôi thêm đường dẫn sau để CPATHgiải quyết vấn đề:

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

Tôi đã thử thêm CPATH; tuy nhiên, tôi vẫn nhận được lỗi tương tự. chỉ cố gắng làm một cout đơn giản << "xin chào";
Jon Pellant

1
Khi tôi thử điều này, nó đã hoạt động trong một thử nghiệm thông thường với GCC 9.2.0 được xây dựng dưới Mojave bằng Xcode 11.1 hiện tại - cảm ơn bạn.
Jonathan Leffler

Điều này làm việc với tôi với GCC 9.2.0_1
Sandeep

5
Nếu bạn đang sử dụng các công cụ dòng lệnh thay vì Xcode.app, hãy sử dụngexport CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
nalzok

Một điều kỳ lạ - Tôi đã nhận được một số mã bắt đầu#include <stdlib.h>và sau đó không thể biên dịch phàn nàn về: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);Cẩn, Tuy nhiên, khi tôi thêm#include <ctype.h>trước đó#include <stdlib.h>, nó biên dịch OK. Vẫn đang tìm hiểu điều này có nghĩa là gì và làm thế nào để xử lý nó tự động.
Jonathan Leffler

48

Trước khi bạn tiến hành, hãy đảm bảo cài đặt các công cụ dòng lệnh xcode.

xcode-select --install

Trên thực tế, bạn có thể làm điều đó! Trên thực tế, tất cả các tiêu đề C được tìm thấy ở đây trong thư mục này:

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

Chúng ta chỉ cần tạo symlink cho tất cả các tệp tiêu đề vào thư mục này:

/usr/local/include/

Nó làm việc cho tôi! dòng lệnh sau sẽ giải quyết tất cả các vấn đề:

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

Bạn sẽ nhận được một số cảnh báo. Một số tiêu đề đã tồn tại, như thế này:

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

hoàn toàn ok để bỏ qua. đó là tất cả.


1
Vâng, tôi cho rằng điều này là có thể - cảm ơn bạn đã gợi ý. Nó không thực sự phù hợp với yêu cầu của tôi về 'vệ sinh hệ thống' (ví dụ: các tiêu đề trùng lặp đó) và /usr/local/hệ thống phân cấp thư mục dành cho phần mềm cục bộ hơn là phần mềm hệ thống. IMO, các tiêu đề nên có /usr/includevà Apple chỉ là một nỗi đau.
Jonathan Leffler

1
Có một cách xung quanh, có thể làm việc, bạn có thể thử. Trong chế độ khôi phục, vô hiệu hóa SIP, sau đó gắn kết /ở chế độ ghi. Sau đó, điền vào /usr/includethư mục. Đó là bởi vì trong 10.15, Hệ thống gắn kết ở chế độ chỉ đọc. mà không vô hiệu hóa SIP, bạn sẽ không thể gắn kết âm lượng Hệ thống.
Roy

@KomolNathRoy: cảm ơn vì gợi ý của bạn. Điều này làm việc cho tôi rất tốt. Cuối cùng tôi có thể cài đặt tất cả các gói mong muốn của mình trong phần mềm thống kê R, bởi vì không có R nào tìm thấy mọi thứ nó cần để cài đặt.
sebastiann

7
Giải pháp này hiệu quả với tôi trên Catalina 10.15
Matthew Barbara

2
Vô hiệu hóa SIP không được tôi chấp nhận, ngay cả khi chỉ là biện pháp tạm thời.
Jonathan Leffler

22

TL; DR

Dường như Apple coi /usr/includenhư 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/usr/bin/clangsẽ 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/includehoặ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/usr/bin/clangvv đã 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 Systemlẫn Librarythư 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 UFLAGSthê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 usrusr/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/includekhông tồn tại theo -isysrootdirlà vô hại (và không thể nhìn thấy mà không có -vtùy chọn).


Xin lỗi không thể làm theo đề nghị của bạn. Tôi nhận được cùng một lỗi với bản cập nhật catalina. Với vscode tôi không thể xây dựng các ứng dụng C ++ và wchar.hkhông tìm thấy lỗi. Tôi đã thử bao gồm thư mục này có tên 'isless' trong không gian tên toàn cầu "
user3279954

Được kích hoạt --verbosetrong tệp tác vụ và nhận thấy rằng vs code đang xem /usr/include/c++/v1/thư mục không còn tồn tại trong catalina. Đã thêm thư mục sau cùng với sdk ở trên và bây giờ nó hoạt động. "-I / Thư viện / Nhà phát triển / CommandLineTools / usr / bao gồm / c ++ / v1 /",
user3279954

@trojanfoe - Tôi thích SCCS nhưng vào năm 1999, không rõ liệu SCCS có hoạt động hoàn toàn sau Y2K hay không (và đã không triển khai SCCS mã nguồn mở tốt mà tôi biết), vì vậy tôi miễn cưỡng chuyển sang RCS.
Jonathan Leffler

Wow: D Vì vậy, vấn đề với /usr/includeviệc mất tích là gì? Nó luôn luôn là một phần của trình biên dịch bao gồm đường dẫn để người dùng không bao giờ cần biết về nó (ngoài khi bạn đang cố gắng tìm nơi nào đó được khai báo). Clang làm tương tự với đường dẫn SDK của nó bên dưới Xcode.appđể hiệu ứng mạng là như nhau.
trojanfoe

1
@trojanfoe: một vấn đề (vấn đề chính của tôi) với /usr/includeAWOL là nếu bạn đã xây dựng GCC của riêng mình từ nguồn, có lẽ nó đã được biên dịch để tìm các tiêu đề hệ thống /usr/includevà do đó việc biên dịch thất bại. Tôi muốn sử dụng GCC mới nhất cũng như Clang. Tôi rất vui khi sử dụng Clang của Apple, nhưng tôi không vui khi sử dụng Clang của Apple giả mạo như GCC - nó không giống với GCC. Tôi chưa tìm ra công thức để xây dựng GCC với các tiêu đề hệ thống được di dời. (Tôi nghĩ --with-native-system-header-dir="${XCODE_HDR}"là một phần của câu trả lời; tuy nhiên, đó không phải là toàn bộ câu trả lời.)
Jonathan Leffler

7

Đặt các Makebiến ẩn sau đây để trỏ đến vị trí của các tiêu đề hiện tại cho Công cụ dòng lệnh 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

Các -isysroottùy chọn cập nhật vị trí của file gốc ra khỏi thư mục hệ thống rễ /.

Vì vậy, điều này đảm bảo rằng các /usr/*tệp chung được tìm thấy ở vị trí mới của chúng.

Đó là, các tập tin tại /Library/Developer/CommandLineTools/SDKs/MacOSX.sdkđược tìm thấy. Những tập tin này là:

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

Trong các tệp tạo tệp của tôi (và hầu hết các tệp tạo tệp khác mà tôi thấy), CFLAGSphức tạp hơn nhiều so với một tùy chọn duy nhất - -isysroottùy chọn sẽ cần phải 'ngoài' các cài đặt khác (rất nhiều cài đặt khác). Có thể có một hạt nhân của một ý tưởng ở đây (vượt qua -isysroottùy chọn và vị trí bên dưới /Library/Developer/…), nhưng nó sẽ cần một số đánh bóng trước khi nó sẵn sàng cho thời gian chính.
Jonathan Leffler

@JonathanLeffler Sử dụng export CFLAGS+=-isysroot ...thay thế sẽ hoạt động cho trường hợp sử dụng đó. Đây là giải pháp duy nhất phù hợp với tôi (trên Mojave (10.14) với SDK Catalina (10.15). Tôi không có .pkgtệp mà mọi người nói về mặc dù các công cụ dòng lệnh và XCode của tôi đã được cập nhật).
Norswap

@Norswap - có một sự khác biệt rất lớn giữa việc sử dụng CFLAGS=…CFLAGS+=….
Jonathan Leffler

@JonathanLeffler đồng ý. Tôi đã cập nhật câu trả lời để sử dụng +=. Cảm ơn @Norswap.
áo

1
Ngoài ra, tôi đã tìm ra rằng cài đặt SDKROOTcho cùng một giá trị sdk ( /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk) sẽ hoạt động tốt với tôi!
Norswap

4

Tôi là người mới sử dụng trình biên dịch C ++ cho R trong OSX và tôi gặp vấn đề tương tự là C ++ không thể tìm thấy tiêu đề sau khi OS được cập nhật ( thiếu math.h mặc dù nó đã ở đó ). Tôi đã làm theo hướng dẫn từ https://thecoatlessprofigator.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/ nhưng không có gì thay đổi.

Cuối cùng, nó hoạt động với tôi sau khi tôi cài đặt lại Xcode CLI

xcode-select --install

và sau đó thay đổi các cờ thành Var như @Coatless đề xuất:

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

Trong trường hợp của tôi, tôi dường như đã llvmgcccũng đã cài đặt bằng homebrew. Khi tôi loại bỏ chúng, và do đó hoàn toàn dựa vào tiếng kêu macOS, nó có thể tìm thấy các tiêu đề và quá trình biên dịch hoạt động trở lại.


0

apue.h sự phụ thuộc vẫn còn thiếu trong tôi /usr/local/includesau khi theo Komol Nath Roy câu trả lời của trong câu hỏi này.

Tôi đã tải xuống phần phụ thuộc thủ công từ git và đặt nó vào /usr/local/include


Tiêu đề apue.hđến từ W Richard Stevens, Stephen A Rago Lập trình nâng cao trong Môi trường Unix, Edn 2013. AFAIK, nó không bao giờ được Apple cung cấp làm tiêu đề hệ thống. (Không phải /usr/includetrên máy của tôi vẫn chạy Mojave.) Nếu nó đã được cài đặt một lần /usr/include, nó có thể được tạo thủ công thay vì được cung cấp bởi Apple. Như vậy, nó đã được cài đặt /usr/local/includetrước đó.
Jonathan Leffler

Xin lỗi vì câu hỏi ngây thơ của tôi nhưng tôi mới bắt tay vào C ++ tuần này. Là phụ thuộc / tiêu đề được quản lý thủ công trong c ++? nếu có, tôi có nên đặt tất cả các phụ thuộc / tiêu đề đã nói /usr/includekhông?
Matthew Barbara

1
Q1: Nhiều hay ít. Nó phụ thuộc một chút vào ý của bạn, nhưng bạn phải lo lắng về sự phụ thuộc và tiêu đề cho C hoặc C ++ nếu các tiêu đề không chuẩn trên (các) máy bạn đang làm việc. Rồi đến câu hỏi - tiêu chuẩn gì? Và về câu trả lời tốt nhất có thể được đưa ra là "nó phụ thuộc", và nó phụ thuộc vào rất nhiều yếu tố - bao gồm cả 'nền tảng' (O / S, trình biên dịch). Q2 là "Không, bạn thường không nên đặt bất cứ thứ gì vào /usr/include" - /usr/local/includethay vào đó hãy sử dụng . Nói chung, an toàn nhất là để lại /usr/include/usr/libmột mình, và thêm vật liệu /usr/localthay thế.
Jonathan Leffler

0

Giải pháp đơn giản hơn tôi nghĩ. Cài đặt clang / llvm.

brew install llvm

Sau đó, chúng ta cần phải tạo liên kết tượng trưng cho chính mình.

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++

Tùy thuộc vào phiên bản llvm của bạn, sửa đổi các lệnh trên.

Bây giờ, bạn có thể biên dịch các chương trình C ++ mà không cần chuyển bất kỳ cờ tùy chỉnh nào.

clang++ hello.cpp

0

Tôi đã thử 1) liên kết thủ công 2) brew install llvm, nhưng chúng không hoạt động.

Cuối cùng, điều này đã làm việc cho tôi: https://gitmemory.com/su/pytorch/pytorch/31190/565153503

Bằng cách thiết lập các vv env sau:

export CC=clang
export CXX=clang++
export MACOSX_DEPLOYMENT_TARGET=10.9

0

Đối với tôi, nó hoạt động tốt như sau:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.