我在cygwin下使用cmake交叉编译嵌入式软件。现在我想编译所有 CUnit 测试计划并在寡妇上使用 CTest。
这样做时,我在 CMakeList.txt 中调用
find_package(CUnit REQUIRED)
,然后它崩溃了。
找不到库。
在我的系统 cygwin 上,我安装了 cmake 包和 cunit 包(我可以使用普通的 makefile 进行编译)
我使用cygwin安装程序并安装:
我确实使用 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
?
如果没有,我该如何解决我的路径问题?
有没有办法配置 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
忽略sysrootONLY_CMAKE_FIND_ROOT_PATH
仅在 sysroot 下搜索。默认情况下,CMake 将首先在重新根目录中搜索,然后在非根目录中搜索,但是即使您不指定该参数,也有各种 CMake 变量会影响此行为。搜索
CMAKE_FIND_ROOT_PATH_MODE_
此处。我假设您正在使用 CMake 工具链文件来设置交叉编译 - 这可能会在您不知情的情况下设置其中之一。
要补充的是,您使用的是 Windows,并且您作为
PATHS
传递的参数在不重新设置搜索目录(因为它们是 Linux 目录)时将不起作用。 (/usr/include/
不是有效的 Windows 路径)