【发布时间】:2022-01-21 20:04:31
【问题描述】:
在使我的应用程序在 Linux 上运行后,我正在尝试为 Windows 和 MacOSX 交叉编译它。我已经在使用 CMake。
我首先创建了一个工具链文件。这行得通。我的 linux 程序是用 mingw 编译的,最后我收到一个 .exe。
# build linux
$ cmake -Bbuild-linux
$ cmake --build build-linux
# build windows
$ cmake -Bbuild-windows -DCMAKE_TOOLCHAIN_FILE=`pwd`/cmake/x86_64-w64-mingw32.cmake
$ cmake --build build-windows
接下来会发生什么,我运行 ctest 来执行单元测试。在 Linux 中,这可以正常工作。但是当我使用交叉编译的东西时,它找不到 .exe 文件。
# run tests linux
(cd build-linux; ctest)
# run tests windows
(cd build-windows; ctest)
没问题,我想 -- 我会根据环境附加 .exe 后缀 -- 使用 if(WIN32)
# CMakeLists.txt
if(WIN32)
SET(EXE_SUFFIX, ".exe")
endif()
ADD_TEST(NAME test_myapp
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/myapp${EXE_SUFFIX} ${CMAKE_CURRENT_SOURCE_DIR}/test_myapp.txt
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
但WIN32 由于某种原因不可用,并且它从不附加后缀。为什么WIN32 不可用?是 ctest 不知道工具链文件中的设置的问题吗?不知道声明了WIN32吗?
我可以在我的 CMakeLists.txt 文件中的其他地方使用 if(WIN32),只要 cmake.exe 正在处理这些行,而不是 ctest.exe。
综上,ctest运行时WIN32没有设置。
有没有办法在不涉及 ctest 的情况下执行单元测试?如果不能信任它可以正确执行此操作,也许我不再使用它了。
【问题讨论】:
-
"但是当我使用交叉编译的东西执行此操作时,它找不到 .exe 文件。" - 请显示确切的错误消息。另外,我不确定
add_test在交叉编译时是否会做任何事情:交叉编译通常意味着要构建一个程序,该程序无法在当前(主机)机器上运行。