我有一个跨平台的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
建议的那样