使用cmake和自定义工具链从Windows交叉编译到Linux

3

我想从 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设置为工具链路径,但是没有任何改变。

我错过了一些选项吗?

1个回答

2

自我回答。

问题出在以下设置中的--sysroot='${CLANG_TOOLCHAIN_ROOT}'

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")
or
set(CMAKE_SYSROOT ${CLANG_TOOLCHAIN_ROOT})

我不太清楚细节,但似乎在使用由UnrealEngine提供的Linux工具链时,我应该将sysroot设置为--sysroot='${CLANG_TOOLCHAIN_ROOT}/usr'

(${TOOLCHAIN_ROOT}/include有嵌套子目录以到达实际头文件,而${TOOLCHAIN_ROOT}/usr/include则没有)

现在我有不同的错误,但这个问题已经解决了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接