我正在尝试为我们的Xcode交叉编译设置CI。交叉编译测试ARMv7和ARMv8。事情看起来不错,除非是时候链接ARMv8:
clang++ -DNDEBUG -g2 -O3 -fPIC -pipe -Wall -miphoneos-version-min=7 -arch arm64 \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk \
-stdlib=libc++ -c cryptlib.cpp
clang++ -DNDEBUG -g2 -O3 -fPIC -pipe -Wall -miphoneos-version-min=7 -arch arm64 \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk \
-stdlib=libc++ -c cpu.cpp
...
clang++ -o cryptest.exe -DNDEBUG -g2 -O3 -fPIC -pipe -Wall -miphoneos-version-min=7 -arch arm64 \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk \
-stdlib=libc++ test.o bench1.o bench2.o ... ./libcryptopp.a
Undefined symbols for architecture arm64:
"CryptoPP::CRC32_Update_ARMV8(unsigned char const*, unsigned long, unsigned int&)", referenced from:
CryptoPP::CRC32::Update(unsigned char const*, unsigned long) in libcryptopp.a(crc.o)
"CryptoPP::CRC32C_Update_ARMV8(unsigned char const*, unsigned long, unsigned int&)", referenced from:
CryptoPP::CRC32C::Update(unsigned char const*, unsigned long) in libcryptopp.a(crc.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [cryptest.exe] Error 1
我们显然不会运行输出工件cryptest.exe
。我们只是编译并链接到测试事物。
在LLVM Clang下,代码测试正常。
所有ARMv8 / Aarch64机器都有CRC-32和CRC-32C;但加密扩展是可选的。这个错误没有多大意义。
Apple Clang在Xcode 10下是否缺少ARMv8 / Aarch64的CRC32?
以下是导致错误的代码。
#if defined(__ARM_FEATURE_CRC32)
void CRC32_Update_ARMV8(const uint8_t *s, size_t n, uint32_t& c)
{
for(; !IsAligned<uint32_t>(s) && n > 0; s++, n--)
c = __crc32b(c, *s);
for(; n > 4; s+=4, n-=4)
c = __crc32w(c, *s);
for(; n > 0; s++, n--)
c = __crc32b(c, *s);
}
#endif
答案 0 :(得分:1)
在Xcode 8.3.3下,我遇到了__crc32 *()的编译错误。然后我添加了命令行开关
-march=armv8-a+crc
在this链接处找到,然后代码编译得很好。我用iphone7 + / iOS10.3.1进行了测试,它正在运行。
根据ARM's document注意(“ARM®体系结构参考手册” ARMv8,对于ARMv8-A体系结构配置文件“DDI0487B_a_armv8_arm.pdf:第A1-58页”,crc32指令对于v8是可选的,对于v8.1是强制性的。当我在iphone6 + / iOS9.3.3上运行相同的程序时,它在__crc32 *处崩溃()。我也用内联汇编程序对它进行了验证。因此,为了避免崩溃,需要进行某种运行时检查。我不完全理解如何,但作为最后的手段,我们可以使用模型名称。 / p>