基于CMake+Unreal自定义工具链从Windows交叉编译Linux GRPC库遇问题
解决方案
要解决这个问题,需要补全和修改工具链文件中的以下配置:
1. 显式指定交叉编译器路径
当前工具链没明确设置CMAKE_C_COMPILER和CMAKE_CXX_COMPILER,CMake可能默认调用了系统Clang,导致自动加载MSVC头文件。添加:
# 明确指定工具链内的Clang编译器 set(CMAKE_C_COMPILER "${CLANG_TOOLCHAIN_BIN}/clang.exe") set(CMAKE_CXX_COMPILER "${CLANG_TOOLCHAIN_BIN}/clang++.exe")
2. 修正--sysroot的引号问题
原COMPILER_FLAGS中--sysroot='${CLANG_TOOLCHAIN_ROOT}'的单引号会导致Clang解析路径错误,无法正确隔离主机头文件,去掉单引号:
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")
3. 添加C语言标准头文件禁用参数
原配置只禁用了C++标准头文件(-nostdinc++),但C语言标准头文件仍可能从主机读取,加上-nostdinc:
set(COMPILER_FLAGS " -nostdinc -nostdinc++ --target=${LINUX_ARCH_NAME} --sysroot=${CLANG_TOOLCHAIN_ROOT} -fno-math-errno -fno-rtti -fno-exceptions -fdiagnostics-format=msvc -funwind-tables -gdwarf-3")
4. 强制清除Windows宏并定义Linux目标宏
Clang在Windows环境下会默认定义_WIN64等Windows宏,需要显式取消并定义Linux相关宏:
# 取消Windows宏,定义Linux目标宏 set(COMPILER_FLAGS "${COMPILER_FLAGS} -U_WIN64 -U_WINDOWS -D__linux__ -D__x86_64__")
5. 显式设置CMAKE_SYSROOT
确保CMake内部逻辑正确使用工具链根目录,添加:
set(CMAKE_SYSROOT "${CLANG_TOOLCHAIN_ROOT}")
6. 将编译器标志关联到CMake变量
最后要把定义好的COMPILER_FLAGS和各模式标志赋值给CMake对应的变量,确保编译时生效:
set(CMAKE_C_FLAGS "${COMPILER_FLAGS}") set(CMAKE_CXX_FLAGS "${COMPILER_FLAGS}") set(CMAKE_C_FLAGS_DEBUG "${FLAGS_DEBUG}") set(CMAKE_CXX_FLAGS_DEBUG "${FLAGS_DEBUG}") set(CMAKE_C_FLAGS_MINSIZEREL "${FLAGS_MINSIZEREL}") set(CMAKE_CXX_FLAGS_MINSIZEREL "${FLAGS_MINSIZEREL}") set(CMAKE_C_FLAGS_RELEASE "${FLAGS_RELEASE}") set(CMAKE_CXX_FLAGS_RELEASE "${FLAGS_RELEASE}") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${FLAGS_RELWITHDEBINFO}") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${FLAGS_RELWITHDEBINFO}")
内容的提问来源于stack exchange,提问作者YeomHyeonSeop
相关产品推荐
相关产品推荐

