windows cygwin下的CMake和CUnit

问题描述 投票:0回答:1

我在cygwin下使用cmake交叉编译嵌入式软件。现在我想编译所有 CUnit 测试计划并在寡妇上使用 CTest。

这样做时,我在 CMakeList.txt 中调用

find_package(CUnit REQUIRED)
,然后它崩溃了。

找不到库。

在我的系统 cygwin 上,我安装了 cmake 包和 cunit 包(我可以使用普通的 makefile 进行编译)

我使用cygwin安装程序并安装:

  • CMake V3.28.3
  • CUnit V2.1.3-1

我确实使用 cygwin,因为由于某种原因我无法使 cmake windows 版本工作。

首先我必须解决cygwin路径问题。 所以我确实创建了一个符号链接,因此 Windows 路径现在可以在 cygwin 上工作,并且 cygwin 路径可以在 cmd.exe 上工作:在 Windows 8.1 上使用 Cygwin 的 ARM GCC :致命错误:没有输入文件

这允许我使用arm-gcc工具链和完整路径进行交叉编译。

第二次我尝试使 Cunit 工作但未找到库。
--> cunit lib 可以手动找到为

/lib/libcunit.dll.a
或在
/usr/lib/libcunit.dll.a
中,不知道为什么它出现了 2 次。

--> cunit include 文件夹在里面

/usr/include/CUnit/CUnit.h

第三,我询问了 Mistral,他告诉我创建一个

FindCunit.cmake
来定位 CUnit 库。所以我执行了他的命令;)我的文件的开头是:

message("including a custom cmake created for cygwin .... ")

set(CMAKE_FIND_DEBUG_MODE 1)

# Explicitly set the search path and disable default paths
find_path(CUnit_INCLUDE_DIRS
  NAMES CUnit.h
  PATHS /usr/include/CUnit
  NO_DEFAULT_PATH
)

if (CUnit_INCLUDE_DIRS)
  message("Found CUnit include directory: ${CUnit_INCLUDE_DIRS}")
else()
  message(FATAL_ERROR "Could not find CUnit include directory")
endif()

# Set the path explicitly and disable default paths
find_library(CUnit_LIBRARIES
  NAMES libcunit.dll.a
  PATHS /lib
  NO_DEFAULT_PATH
)

if (CUnit_LIBRARIES)
  message("Found CUnit library: ${CUnit_LIBRARIES}")
else()
  message(FATAL_ERROR "Could not find CUnit library")
endif()

它崩溃了,他既找不到库也找不到包含文件。 使用

set(CMAKE_FIND_DEBUG_MODE 1)
运行,向我展示实际问题:

 find_path considered the following locations:

    /cygdrive/c/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.3 rel1/bin/../usr/include/CUnit/CUnit.h

他使用的路径很糟糕,但我以为我指定了

NO_DEFAULT_PATH
并强加了
/lib
路径!但出于某种原因,他在我的路径之前附加了
arm-gcc
工具链的 pat。

我尝试过:

# Explicitly set the search path and disable default paths
find_path(CUnit_INCLUDE_DIRS
  NAMES CUnit.h
  PATHS ../../../../../usr/include/CUnit
  NO_DEFAULT_PATH
)

但这也给了我

/cygdrive/c/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.3 rel1/bin/../cygdrive/c/Users/guill/usr/include/CUnit/CUnit.h

我现在有点困惑。

有没有办法配置 cygwin cmake 来获取 cygwin CUnit,而无需创建

FindCunit.cmake
? 如果没有,我该如何解决我的路径问题?

c cmake compilation cmakelists-options cunit
1个回答
0
投票

有没有办法配置 cygwin cmake 来获取 cygwin CUnit,而无需创建

FindCunit.cmake

除非 CUnit 附带了 CMake 可以找到的自己的查找模块(快速网络搜索表明它不能),那么您必须告诉 CMake 如何找到该库。您不需要需要创建这样的文件 - 您可以将内容放入调用的CMakeLists.txt中,但有些人可能认为拥有额外的文件更整洁。

如果没有,我该如何解决我的路径问题?

CMake

find_
函数有一个可以传入的附加标志。它是以下之一:
CMAKE_FIND_ROOT_PATH_BOTH
NO_CMAKE_FIND_ROOT_PATH
ONLY_CMAKE_FIND_ROOT_PATH

文档更详细地描述了这些内容,但为了简化它:

  • CMAKE_FIND_ROOT_PATH_BOTH
    告诉函数搜索您给它的路径,以及带有 sysroot 前缀的相同路径。即,系统根为
    /foo
    且搜索路径为
    /bar
    ,它将在
    /foo/bar
    /bar
    中搜索。
  • NO_CMAKE_FIND_ROOT_PATH
    忽略sysroot
  • ONLY_CMAKE_FIND_ROOT_PATH
    仅在 sysroot 下搜索。

默认情况下,CMake 将首先在重新根目录中搜索,然后在非根目录中搜索,但是即使您不指定该参数,也有各种 CMake 变量会影响此行为。搜索

CMAKE_FIND_ROOT_PATH_MODE_
此处。我假设您正在使用 CMake 工具链文件来设置交叉编译 - 这可能会在您不知情的情况下设置其中之一。

要补充的是,您使用的是 Windows,并且您作为

PATHS
传递的参数在不重新设置搜索目录(因为它们是 Linux 目录)时将不起作用。 (
/usr/include/
不是有效的 Windows 路径)

© www.soinside.com 2019 - 2024. All rights reserved.