Setelah memutakhirkan ke Catalina dari Mojave, Pengaturan: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk di env.
Saya tidak dapat mengkompilasi program yang digunakan <cmath>
header.
Saya mencoba mengubah CFLAGS, CCFLAGS, CXXFLAGS untuk menunjuk ke Lokasi MacOSSDK yang tidak mengubah apa pun
Scanning dependencies of target OgreMain
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f OgreMain/CMakeFiles/OgreMain.dir/build.make OgreMain/CMakeFiles/OgreMain.dir/build
[ 0%] Building CXX object OgreMain/CMakeFiles/OgreMain.dir/src/OgreASTCCodec.cpp.o
cd /Users/roman/Downloads/ogre-1.12.2/build/OgreMain && /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -DOgreMain_EXPORTS -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OSX -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include/Threading -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src -I/Users/roman/Downloads/ogre-1.12.2/build/Dependencies/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include -I/Users/roman/Downloads/ogre-1.12.2/build/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain -isystem /usr/local/include -Wall -Winit-self -Wcast-qual -Wwrite-strings -Wextra -Wundef -Wmissing-declarations -Wno-unused-parameter -Wshadow -Wno-missing-field-initializers -Wno-long-long -Wno-inconsistent-missing-override -msse -O3 -DNDEBUG -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -std=c++11 -o CMakeFiles/OgreMain.dir/src/OgreASTCCodec.cpp.o -c /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreASTCCodec.cpp
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreASTCCodec.cpp:29:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreStableHeaders.h:40:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/include/OgrePrerequisites.h:309:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/include/OgreStdHeaders.h:10:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:314: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:315: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:316:9: error: no member named 'isfinite' in the global namespace; did you mean 'finite'?
using ::isfinite;
misalnya makro: isless
hadir di namespace global dan di komputer saya:
➜ cat math.h | grep "isless"
#define isless(x, y) __builtin_isless((x),(y))
#define islessequal(x, y) __builtin_islessequal((x),(y))
#define islessgreater(x, y) __builtin_islessgreater((x),(y))
➜ pwd
/usr/local/include
➜
Bahkan header cmath memasukkannya:
➜ cat /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath | grep "math.h"
#include <math.h>
Dan baris perintah saya memiliki opsi -isystem /usr/local/include
Ini seharusnya bekerja ...
xcode-select -p
cocok dengan tempat Xcode berada? Bisakah Anda mengubah kode untukusing std::signbit;
, juga untuk yang lain? Apakah Anda mengkompilasi sebagai C ++ 11 atau lebih baru?xcode-select -p
cocok di manaXCode
berada.using ::signbit;
dan simbolnya tidak ada di namespace global, itu distd::
namespace. Saya kira juga dengan yang lain (saya tidak mengejar mereka).Jawaban:
Saya ingin tahu: Kompiler apa yang Anda gunakan? Apa nilainya
CMAKE_OSX_SYSROOT
?Saya cukup yakin ini adalah hasil kesalahan
CMAKE_OSX_SYSROOT
. Saya punya masalah yang Anda gambarkan ketika menggunakan binding python untuk dentang (di mana CMake tidak mengelola panggilan kompiler), tapi saya berhasil membuat kesalahan di CMake dengan melakukan:Saya memecahkan masalah saya dengan mengikuti jawaban untuk pertanyaan ini: Tidak dapat mengkompilasi paket R dengan kode c ++ setelah memperbarui ke macOS Catalina .
Untuk meringkas: Pada Catalina,
/usr/include
dibersihkan dan dilindungi oleh SIP. Dengan demikian, setiap proyek yang mengharapkan header C ditemukan di sana akan gagal dikompilasi. Jika saya ingat dengan benar, Apple merekomendasikan untuk mengajukan laporan bug ke proyek yang mengharapkan header C masuk/usr/include
.Anda harus mengarahkan sistem pembuatan kode yang Anda coba kompilasi ke header yang tepat:
(1) Pastikan Xcode terbaru. Tidak ada yang tahu apa yang mungkin dilakukan Xcode Catalina pada lingkungan build Anda.
(2) Gunakan
-isysroot /sdk/path
flag compiler, di mana/sdk/path
hasilnyaxcrun --show-sdk-path
. Saya tidak yakin apa praktik terbaik CMake, tapi coba lakukanatau
Jika itu menyelesaikan masalah, Anda mungkin ingin mencari cara yang lebih baik untuk melakukan ini di CMake.
Tentu saja, jika Anda berjiwa petualang, Anda juga dapat menonaktifkan SIP, seperti yang disarankan dalam jawaban untuk pertanyaan saya: / usr / sertakan hilang pada macOS Catalina (dengan Xcode 11)
sumber
set(CMAKE_OSX_SYSROOT ...)
masuk keCMakeLists.txt
, bukan shell.Saya mengalami masalah yang sama ketika mencoba menargetkan iOS (baik di MacBook Air dan di runner GitHub Actions) dan berikut adalah beberapa pemikiran tentang masalah ini meskipun saya tidak cukup akrab dengan ekosistem Apple untuk menyarankan solusi yang tepat. Baris perintah asli berasal dari CMake di cpprestsdk, tapi begitu saya merebusnya menjadi esensi, di sini ada repro pendek.
cmath-bug.cpp
dengan satu-satunya baris di dalamnya:Ketika saya menjalankannya, saya menjadi familiar bagi banyak orang yang menghadapi masalah yang sama:
Hanya 2 direktori yang saya berikan pada baris perintah asli saya yang ada dan adalah:
Tetapi bit yang menarik di sini adalah direktori yang tidak ada termasuk yang dilaporkan serta direktori include yang akhirnya dicari dan urutannya. Dugaan saya adalah bahwa direktori tambahan yang tidak disebutkan pada baris perintah dimasukkan oleh driver Apple Clang berdasarkan pada beberapa logika khusus Apple.
Anda dapat melihat dari kesalahan yang dilaporkan bahwa
<cmath>
tajuk ditemukan di:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath
dan pada baris 304 Anda dapat melihat:Dilihat dari fakta bahwa dalam folder yang sama
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/
ada filemath.h
yang memberikan definisi yang diperlukan, misalnya:penulis
<cmath>
mengharapkanmath.h
dari folder yang sama dimasukkan terlebih dahulu dan kemudian#include_next <math.h>
direktif menemukan sistem-spesifikmath.h
. Namun bukan itu yang terjadi dalam kenyataan.Jika Anda melihat 2 entri pertama di direktori yang dicari:
Anda melihat bahwa direktori menyertakan khusus sistem akhirnya berada di atas direktori perpustakaan standar Dentang-disuntikkan, itulah sebabnya mengapa sistem khusus
math.h
ditemukan, bukan yang ada di folder yang sama dengan sisa header perpustakaan standar. Ini mungkin terjadi karena jika saya secara eksplisit menambahkan perpustakaan standar termasuk direktori ke baris perintah saya SEBELUM dua direktori lain-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
masalah hilang dan saya dapat mengkompilasi file. Bukan itu yang dilakukan oleh driver Clang atau apa pun yang terlibat di sini secara otomatis: ia menambah direktori library standar via-internal-system
(tidak yakin apa arti semantik dari flag internal itu) dan menambahkannya SETELAH direktori sistem.Sekarang jika Anda melihat daftar direktori yang diabaikan, entri pertama dalam daftar itu adalah:
di mana bagian trailing
c++/v1
tidak ada di mesin saya, membuat saya bertanya-tanya apakah instalasi iPhone SDK seharusnya membuat tautan simbolisc++
di dalam bagian jalur yang ada untuk menunjuk ke/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++
direktori untuk membuat semuanya berfungsi.Ngomong-ngomong, ini yang kupikir sedang terjadi dan aku bertanya-tanya apakah ada yang tahu bagaimana cara memperbaikinya dengan benar?
Terima kasih!
PS Untuk konteksnya:
sumber
Menggunakan perintah:
urutan pencarian #include <...> saya:
Alasan #include error dijelaskan di bawah ini:
Cara mengatasinya:
Saya telah mengikuti opsi # 2 dan build berhasil sekarang!
Dan terima kasih kepada solodon untuk jawaban terperinci. Saya mengikuti jawaban untuk memperbaiki masalah ini.
sumber
Mungkin saja salinan Xcode Anda rusak. Periksa dengan codesign:
Ini terjadi pada saya, dan masalahnya Xcode rusak. Menginstal ulang memperbaikinya.
Sesuatu telah mengubah yang berikut:
math.h
kosong di semua tempat di atas.sumber
Analisis @ solodon tepat. Masalahnya adalah kemungkinan bahwa
cmath
file tersebut termasuk versi yang salahmath.h
berdasarkan urutan pencarian file header. Setidaknya, inilah yang terjadi pada saya ketika saya mendapatkan kesalahan yang sama.Pindai output kompiler Anda
#include <...> search starts here:
. Anda juga dapat memaksa output ini dari baris perintah dengan (sumber) :Seharusnya terlihat seperti ini:
Perhatikan bahwa jalan dengan
Toolchains
datang sebelum mereka denganPlatforms
. Jika dalam kasus Anda urutannya terbalik, Anda perlu mencari tahu apa yang menyebabkan konfigurasi ini. Bagi saya, itu adalah pengaturan eksplisitCPLUS_INCLUDE_PATH
dalam skrip login saya.Kode yang menyinggung:
Ini adalah bagian dari upaya saya untuk bekerja di sekitar Xcode 11 tidak lagi menyediakan paket instalasi untuk file header SDK. Setelah menghapus kode ini, saya berhasil memasukkan
cmath
dalam kode C ++ saya.Jika Anda datang ke sini mencari solusi untuk masalah ini, Anda mungkin memerlukan solusi yang berbeda tetapi mudah-mudahan ini membantu menjelaskan apa yang tampaknya menjadi penyebab utama masalah ini, urutan jalur pencarian file header.
sumber
Saya menemukan bahwa di dalam proyek saya, saya punya file
math.h
. Setelah mengganti nama, masalahnya hilang. Jahitancmath
termasuk file saya, bukan sistem.sumber
Saya baru saja mendapatkan kesalahan ini ketika mencoba mengkompilasi gRPC setelah baru-baru ini melakukan upgrade ke 10.15.4 dan Xcode 11.4 dan saya mulai melihat semua solusi yang ditawarkan (di sini dan Tidak dapat mengkompilasi program C pada Mac setelah memutakhirkan ke Catalina 10.15 ) , dan mencoba beberapa dari mereka (meskipun tidak mencoba untuk menciptakan kembali
/usr/include
karena itu akan melanggar pemisahan yang coba dibuat oleh Apple) - sepertinya tidak ada yang berhasil.Saya kemudian melihat lebih dekat pada permintaan kompos yang sebenarnya yang
make
dihasilkan oleh proses dan memperhatikan bahwa ada yang eksplisityang pada akhirnya menyebabkan menyertakan terjadi dalam urutan yang salah - menghapus jalur menyertakan eksplisit ini memungkinkan kompilasi untuk berhasil dengan instalasi default catalina, Xcode dan alat-alat baris perintah Xcode, seperti yang Anda harapkan, tidak ada trik lain / flag penyusun dibutuhkan.
sumber
pkg-config
file (misalnya libcurl) dari Homebrew menambahkan jalur ini secara otomatis, bahkan jika Anda memiliki Xcode diinstal. Ini diperbaiki di Homebrew 2.2.13. Lebih detail di github.com/Homebrew/brew/issues/5068 ; PR yang memperbaikinya ada di github.com/Homebrew/brew/pull/7331 . TL; DR: Perbarui homebrewAnda dapat mencoba menggunakan CommandLineTools SDK daripada XCode.app SDK.
Saya memperbaiki masalah ini ketika saya mengkompilasi PointCloudLibrary (PCL)
Juga, instal ulang XCode.app dan CommandLineTools dapat membantu.
sumber
Ringkasan: dalam kasus saya, skrip build menggunakan versi yang lebih lama dari
ios-cmake
toolchain yang (2.1.2), dan memutakhirkannya ke 3.1.2 memperbaiki masalah menyertakan cmath / matematika.Menyesuaikan perintah bagus yang diusulkan oleh @Ryan H.
gcc -Wp,-v -E -
untuk kasus saya (dentang, c ++, target iOs)hasil pada dua Catalina termasuk satu perawan di mana hanya alat yang pernah diinstal adalah XCode 11.14.1:
Jadi jalur sertakan yang benar adalah yang pertama yang tidak diabaikan, semuanya harus bekerja dengan baik, tetapi tidak. Tampaknya masalah berasal dari perintah tambahan yang ditambahkan ke panggilan kompilasi oleh toolchain ios-cmake:
Pelakunya adalah
-Isystem ...
baris, yang akan menyebabkan#include <math>
baris dalam file cmath berakhir dengan memuat file yang salah. Setelah banyak mengutak-atik mencoba untuk memperbaiki skrip cmake, saya perhatikan versi lama dari ios-cmake, dan memutakhirkannya memiliki efek 'satu-satunya' untuk menghapus-Isystem
baris yang tidak diinginkan - semuanya hampir sama (terlepas dari beberapa opsi kompiler)sumber