ฉันมีปัญหาเดียวกันในขณะที่พยายามกำหนดเป้าหมาย iOS (ทั้งใน MacBook Air และ GitHub Actions Runner) และนี่คือความคิดเพิ่มเติมเล็กน้อยเกี่ยวกับปัญหาแม้ว่าฉันจะไม่คุ้นเคยกับระบบนิเวศของ Apple เพื่อแนะนำวิธีแก้ปัญหาที่เหมาะสม บรรทัดคำสั่งดั้งเดิมมาจาก CMake ใน cpprestsdk แต่เมื่อฉันต้มลงไปถึงสิ่งจำเป็นนี่เป็นข้อผิดพลาดสั้น ๆ
- สร้างไฟล์ที่
cmath-bug.cpp
มีบรรทัดเดียวในนั้น:
#include <cmath>
- เรียกใช้ (ขึ้นบรรทัดใหม่หน้าอาร์กิวเมนต์บางตัวเพื่อความสะดวกในการอ่านลบออก)
clang -v -x c++ -target arm64-apple-ios13.2 -fcolor-diagnostics -std=c++11 -stdlib=libc++
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk
-isystem /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
-c cmath-bug.cpp
เมื่อฉันเรียกใช้ฉันได้ทำความคุ้นเคยกับหลาย ๆ คนหันหน้าไปทางปัญหาเดียวกัน:
Apple clang version 11.0.0 (clang-1100.0.33.16)
Target: arm64-apple-ios13.2
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 arm64-apple-ios13.2.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name cmath-bug.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-strict-return -masm-verbose -munwind-tables -target-sdk-version=13.2 -target-cpu cyclone -target-feature +fp-armv8 -target-feature +neon -target-feature +crypto -target-feature +zcm -target-feature +zcz -target-feature +sha2 -target-feature +aes -target-abi darwinpcs -fallow-half-arguments-and-returns -dwarf-column-info -debugger-tuning=lldb -ggnu-pubnames -target-linker-version 530 -v -coverage-notes-file /Users/myuser/Projects/C++/cmath-bug.gcno -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk -isystem /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include -stdlib=libc++ -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1 -Wno-framework-include-private-from-public -Wno-atimport-in-framework-header -Wno-extra-semi-stmt -Wno-quoted-include-in-framework-header -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /Users/myuser/Projects/C++ -ferror-limit 19 -fmessage-length 204 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fobjc-runtime=ios-13.2.0 -fcxx-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o cmath-bug.o -x c++ cmath-bug.cpp
clang -cc1 version 11.0.0 (clang-1100.0.33.16) default target x86_64-apple-darwin19.0.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include/c++/v1"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/Library/Frameworks"
ignoring duplicate directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include"
#include "..." search starts here:
#include <...> search starts here:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
/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/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/System/Library/Frameworks (framework directory)
End of search list.
In file included from cmath-bug.cpp:1:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:318:9: error: no member named 'signbit' in the global namespace
using ::signbit;
~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:319:9: error: no member named 'fpclassify' in the global namespace
using ::fpclassify;
~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:320:9: error: no member named 'isfinite' in the global namespace; did you mean 'finite'?
using ::isfinite;
~~^
มีไดเรกทอรี 2 รายการเท่านั้นที่ฉันส่งผ่านบรรทัดคำสั่งดั้งเดิมของฉันและมีดังนี้:
$ ls -alF /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk
lrwxr-xr-x 1 root wheel 12B Dec 17 11:54 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk@ -> iPhoneOS.sdk
$ ls -alF /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
total 2160
drwxr-xr-x 169 root wheel 5.3K Dec 17 12:07 ./
drwxr-xr-x 5 root wheel 160B Nov 4 19:22 ../
...
-rw-r--r-- 9 root wheel 32K Nov 4 19:52 math.h
...
แต่บิตที่น่าสนใจที่นี่คือไดเรกทอรีรวมที่ไม่มีอยู่ซึ่งรายงานและไดเรกทอรีรวมที่จะสิ้นสุดการค้นหาในที่สุดและลำดับของพวกเขา ฉันเดาว่าไดเรกทอรีเพิ่มเติมที่ไม่ได้กล่าวถึงในบรรทัดคำสั่งจะถูกแทรกโดยไดรเวอร์ของ Apple Clang ตามตรรกะเฉพาะของ Apple
คุณสามารถดูจากข้อผิดพลาดที่รายงานที่<cmath>
ส่วนหัวพบได้ที่: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath
และที่บรรทัดที่ 304 คุณสามารถดู:
#include <__config> // Line 304
#include <math.h> // This one ends up causing troubles
#include <__cxx_version>
ตัดสินจากข้อเท็จจริงที่ว่าในโฟลเดอร์เดียวกัน/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/
นั้นมีไฟล์math.h
ที่ให้คำจำกัดความที่จำเป็นเช่น:
#include <__config>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#pragma GCC system_header
#endif
#include_next <math.h>
#ifdef __cplusplus
// We support including .h headers inside 'extern "C"' contexts, so switch
// back to C++ linkage before including these C++ headers.
extern "C++" {
#include <type_traits>
#include <limits>
// signbit
#ifdef signbit
template <class _A1>
_LIBCPP_INLINE_VISIBILITY
bool
__libcpp_signbit(_A1 __lcpp_x) _NOEXCEPT
{
return signbit(__lcpp_x);
}
#undef signbit
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
signbit(_A1 __lcpp_x) _NOEXCEPT
{
return __libcpp_signbit((typename std::__promote<_A1>::type)__lcpp_x);
}
...
#elif defined(_LIBCPP_MSVCRT)
...
#endif // signbit
ผู้เขียน<cmath>
ได้รับการคาดหวังว่าmath.h
จากโฟลเดอร์เดียวกันกับที่จะรวมอยู่ก่อนแล้วจึงสั่งหาระบบที่เฉพาะเจาะจง#include_next <math.h>
math.h
นั่นไม่ใช่สิ่งที่เกิดขึ้นในความเป็นจริงอย่างไรก็ตาม
หากคุณดูที่ 2 รายการแรกในไดเรกทอรีที่ค้นหา:
#include <...> search starts here:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
คุณเห็นว่าไดเรกทอรีรวมระบบเฉพาะนั้นอยู่เหนือไดเรกทอรีไดเรกทอรีมาตรฐาน Clang-injected ซึ่งเป็นสาเหตุที่math.h
พบเฉพาะระบบไม่ได้อยู่ในโฟลเดอร์เดียวกับส่วนหัวที่เหลือของไลบรารีมาตรฐาน อาจเป็นกรณีนี้เพราะหากฉันเพิ่มไดเรกทอรีมาตรฐานไลบรารีรวมไปยังบรรทัดคำสั่งของฉันอย่างชัดเจนก่อนที่อีกสองไดเรกทอรี-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
ปัญหาจะหายไปและฉันสามารถรวบรวมไฟล์ นั่นไม่ใช่สิ่งที่คนขับรถเสียงดังกราวหรือสิ่งอื่นที่มีส่วนเกี่ยวข้องที่นี่ไม่โดยอัตโนมัติจะเพิ่มว่าไดเรกทอรีห้องสมุดมาตรฐานผ่าน-internal-system
(ไม่แน่ใจว่าสิ่งที่เป็นความหมายของธงภายในที่) และจะเพิ่มมันหลังจากไดเรกทอรีระบบ
ตอนนี้ถ้าคุณดูรายการของไดเร็กตอรี่ที่ถูกละเว้น, รายการแรกในรายการนั้นคือ:
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include/c++/v1"
ซึ่งc++/v1
ส่วนต่อท้ายไม่มีอยู่ในเครื่องของฉันทำให้ฉันสงสัยว่าการติดตั้ง iPhone SDK นั้นควรจะสร้างลิงค์สัญลักษณ์c++
ภายในส่วนที่มีอยู่ของเส้นทางที่ชี้ไปที่/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++
ไดเรกทอรีเพื่อให้สิ่งต่าง ๆ ทำงานได้หรือไม่
อย่างไรก็ตามนี่คือสิ่งที่ฉันคิดว่าจะเกิดขึ้นและฉันสงสัยว่าใครรู้วิธีการแก้ไขอย่างถูกต้องหรือไม่
ขอบคุณ!
PS สำหรับบริบท:
$ xcode-select -p
/Applications/Xcode.app/Contents/Developer
$ xcrun --show-sdk-path -sdk iphoneos13.2
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk
xcode-select -p
ตรงกับที่ Xcode ตั้งอยู่? คุณสามารถเปลี่ยนรหัสเป็นusing std::signbit;
เช่นเดียวกันกับผู้อื่นได้หรือไม่ คุณรวบรวมเป็น C ++ 11 หรือใหม่กว่าหรือไม่