IOS को लक्षित करने की कोशिश करते समय मुझे वही समस्या हो रही है (दोनों मेरे मैकबुक एयर और गिटहब एक्ट्स रनर पर) और यहां समस्या पर कुछ और विचार हैं, हालांकि मैं उचित समाधान का सुझाव देने के लिए Apple के पारिस्थितिकी तंत्र से परिचित नहीं हूं। मूल कमांड लाइन cpprestsdk में CMake से आ रही थी, लेकिन एक बार जब मैंने इसे आवश्यक रूप से उबाला, तो यहां एक छोटा प्रतिनिधि है।
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
...
लेकिन यहाँ दिलचस्प बिट्स गैर-मौजूदा शामिल निर्देशिकाएं हैं जो इसे रिपोर्ट करती हैं और साथ ही साथ इसमें शामिल निर्देशिकाओं को अंत में और उनके क्रम को खोजती हैं। मेरा अनुमान है कि कमांड लाइन पर उल्लिखित अतिरिक्त निर्देशिकाओं को कुछ एप्पल-विशिष्ट तर्क के आधार पर एप्पल क्लैंग के ड्राइवर द्वारा डाला गया है।
आप रिपोर्ट की गई त्रुटि से देख सकते हैं कि <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
आप देखते हैं कि सिस्टम-विशिष्ट में डायरेक्ट्री क्लैंग-इंजेक्टेड स्टैंडर्ड लाइब्रेरी डायरेक्टरी से ऊपर है, यही वजह है कि सिस्टम-स्पेसिफिक 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++
जो कि पूरी चीज़ को काम करने के लिए डायरेक्टरी को इंगित करने के लिए पथ के मौजूदा भाग के अंदर है ।
वैसे भी, मुझे लगता है कि यह हो रहा है और मुझे आश्चर्य है कि अगर किसी को पता है कि इसे ठीक से कैसे तय किया जाए?
धन्यवाद!
संदर्भ के लिए पुनश्च:
$ 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 या बाद में संकलन कर रहे हैं?