在 CMake 项目中的 Mac 上链接时"error: source file is not valid UTF-8"



我有一个跨平台的CMake项目,它使用了一些第三方依赖关系。在Windows上构建得很好,但是当在Mac上使用ninja构建时,我在链接Optick时得到以下错误:

[949/972] Linking CXX shared library Engine/External/optick/libOptickCore.dylib
FAILED: Engine/External/optick/libOptickCore.dylib 
: && /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -x objective-c++ -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk -dynamiclib -Wl,-headerpad_max_install_names  -o Engine/External/optick/libOptickCore.dylib -install_name @rpath/libOptickCore.dylib Engine/External/optick/CMakeFiles/OptickCore.dir/src/optick_capi.cpp.o Engine/External/optick/CMakeFiles/OptickCore.dir/src/optick_core.cpp.o Engine/External/optick/CMakeFiles/OptickCore.dir/src/optick_gpu.cpp.o Engine/External/optick/CMakeFiles/OptickCore.dir/src/optick_gpu.d3d12.cpp.o Engine/External/optick/CMakeFiles/OptickCore.dir/src/optick_gpu.vulkan.cpp.o Engine/External/optick/CMakeFiles/OptickCore.dir/src/optick_message.cpp.o Engine/External/optick/CMakeFiles/OptickCore.dir/src/optick_miniz.cpp.o Engine/External/optick/CMakeFiles/OptickCore.dir/src/optick_serialization.cpp.o Engine/External/optick/CMakeFiles/OptickCore.dir/src/optick_server.cpp.o   && :
Engine/External/optick/CMakeFiles/OptickCore.dir/src/optick_capi.cpp.o:1:1: error: source file is not valid UTF-8
<CF><FA><ED><FE><U+000C><U+0000><U+0000><U+0001><U+0000><U+0000><U+0000><U+0000><U+0001><U+0000><U+0000><U+0000><U+0004><U+0000><U+0000><U+0000><U+0008><U+0002><U+0000><U+0000><U+0000> <U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0019><U+0000><U+0000><U+0000><88><U+0001><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000>H
^

这些错误似乎发生在从OptickCore目标生成的所有对象文件上。

这个项目是通过CMake生成的,它配置得很好。

The C compiler identification is AppleClang 14.0.0.14000029
The CXX compiler identification is AppleClang 14.0.0.14000029
Detecting C compiler ABI info
Detecting C compiler ABI info - done
Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
Detecting C compile features
Detecting C compile features - done
Detecting CXX compiler ABI info
Detecting CXX compiler ABI info - done
Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
Detecting CXX compile features
Detecting CXX compile features - done

Optick在CMake脚本通过target_link_libraries链接,其中我链接OptickCore作为PUBLIC,然后添加OptickCMakeLists.txt作为子目录。

源文件的字符集都是us-ascii

matthewloveday@192 src % file -I optick_capi.cpp
optick_capi.cpp: text/x-c; charset=us-ascii

对象文件的字符集为二进制

matthewloveday@192 src % file -I optick_capi.cpp.o     
optick_capi.cpp.o: application/x-mach-binary; charset=binary

我从来没有处理过这个错误,所以我不知道从哪里开始,任何帮助是感激的!

错误在未显示的CMakeLists.txt中。

你告诉AppleClang它所有的输入都是objective - c++文件源:-x objective-c++,而你给的是目标文件optick_capi.cpp.o optick_core.cpp.o ...。AppleClang正确地告诉你optick_capi.cpp.o不是UTF-8编码的objective - c++源文件。

我的猜测是,您正在以某种方式构建Optik,以便将其目标文件构建到自己的源目录中。因为它对源文件有一个非常糟糕的glob,它也会把任何目标文件作为源文件。

你应该改变glob,只拾取cpp和头文件,或者最好不使用glob,就像cmake

建议的那样

相关内容

最新更新