我想从 Windows 64 位主机编译 Linux x86_64 目标的 grpc 库,并使用 Unreal Engine 团队提供的跨平台自定义工具链。
这是我的工具链文件(我认为与此相关)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(LINUX_ARCH_NAME "x86_64-unknown-linux-gnu")
set(CLANG_TOOLCHAIN_ROOT "${TOOLCHAIN_ROOT}/${LINUX_ARCH_NAME}")
set(CLANG_TOOLCHAIN_BIN "${CLANG_TOOLCHAIN_ROOT}/bin")
set(CPACK_PACKAGE_ARCHITECTURE "${LINUX_ARCH_NAME}")
set(CMAKE_C_COMPILER_WORKS 1)
set(CMAKE_CXX_COMPILER_WORKS 1)
set(CMAKE_FIND_ROOT_PATH ${CLANG_TOOLCHAIN_ROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(COMPILER_FLAGS " -nostdinc++ --target=${LINUX_ARCH_NAME} --sysroot='${CLANG_TOOLCHAIN_ROOT}' -fno-math-errno -fno-rtti -fno-exceptions -fdiagnostics-format=msvc -funwind-tables -gdwarf-3")
set(FLAGS_DEBUG " -O0 -g -D_DEBUG")
set(FLAGS_MINSIZEREL " -Os -DNDEBUG")
set(FLAGS_RELEASE " -O3 -DNDEBUG")
set(FLAGS_RELWITHDEBINFO " -O3 -g -D_DEBUG")
set(CMAKE_SYSTEM_INCLUDE_PATH "")
set(CMAKE_INCLUDE_PATH "")
这是我的构建命令
cmake -G "Ninja Multi-Config" -DCMAKE_TOOLCHAIN_FILE="./for_linux.cmake" ..
它成功地完成了,没有任何错误。
然后当我尝试构建时。
cmake --build .
一些代码编译成功了,但是有些失败了,因为它包含了主机环境的头文件(如Windows Kit或MSVC)
C:/Toolchains/x86_64-unknown-linux-gnu/bin/clang.exe -I... -I.... -IC:/Toolchains/x86_64-unknown-linux-gnu/usr/include -I.... -I....
(there is no path to MSVC or Windows Kit in -I args)
C:/Toolchains/x86_64-unknown-linux-gnu/usr/include/stdint.h:122:27: error: typedef redefined with different types ('unsigned long' vs 'unsinged long long')
typedef unsigned long int uintptr_t;
^
C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.34.31933/include/vadefs.h:61:35: note: previous definition is here
typedef unsigned __int64 uintptr_t;
^
我不明白为什么clang要使用那些MSVC头文件。
我以为set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
选项可以防止这样的问题,而且执行命令似乎没有包含MSVC路径。
而且看起来clang也会编译带有_WIN64宏的代码。
我尝试了一些谷歌搜索出来的选项,比如将CMAKE_SYSROOT设置为工具链路径,但是没有任何改变。
我错过了一些选项吗?