【问题标题】:ctest doesn't seem to use the settings in CMAKE_TOOLCHAIN_FILEctest 似乎没有使用 CMAKE_TOOLCHAIN_FILE 中的设置
【发布时间】: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在交叉编译时是否会做任何事情:交叉编译通常意味着要构建一个程序,该程序无法在当前(主机)机器上运行。

标签: linux windows cmake


【解决方案1】:

这一行完全不正确:

SET(EXE_SUFFIX, ".exe")

您设置了变量EXE_SUFFIX,,而不是EXE_SUFFIX。当您稍后展开 ${EXE_SUFFIX} 时,它返回为空,因此从程序的其余部分的角度来看,整个 if (WIN32) 块是无操作的。

【讨论】:

  • 你认为这样的错别字值得回答吗?我几乎每周都会看到一个带有额外逗号的问题。
  • 修正错字后可能还发现了其他问题。这是一个起点。
  • “修正错字后可能还发现了其他问题。” - 好吧,在那种情况下,comment 似乎比答案更合适。
  • 您认为接下来的对话进展如何?
  • 加了一个逗号。
猜你喜欢
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
相关资源
最近更新 更多