在MSYS2 env中,当我使用std::string时,CTest失败并出现0xc0000135错误



对不起,实际上我不知道这是一个CMake, MSYS2或g++问题?我创建了一个简单的CMake项目如下:

Hello/
|__build/
|__CMakeLists.txt
|__lib/
|__CMakeLists.txt
|__foo.cpp
|__foo.h
|__tests/
|__CMakeLists.txt
|__test0.cpp

foo.cpp和foo.h定义了一个简单的函数foo(), test0.cpp调用foo(),就是这样。

如果foo()没有声明,这个项目在MSYS2/mingw64(和MSYS2/clang64) env中运行正常std:: string。但是如果我在foo()中声明std::string, CTest将会失败0 xc0000135错误。我的意思是如果foo()看起来像这样

int foo(int in) {
printf("HELLO %dn", in);
return in;
}

一切正常。但

int foo(int in) {
str::string msg = "HELLO";
printf("HELLO %dn", in);
return in;
}

ctest将失败,并显示以下错误消息!!

> ctest
Test project D:/Hello/build
Start 1: test0
1/1 Test #1: test0 ............................Exit code 0xc0000135
***Exception:   0.02 sec
0% tests passed, 1 tests failed out of 1
Total Test time (real) =   0.02 sec
The following tests FAILED:
1 - test0 (Exit code 0xc0000135
)
Errors while running CTest
Output from these tests are in: D:/KC/msys64/home/user/hello-07.std/build/Testing/Temporary/LastTest.log

欢迎任何建议。非常感谢。

源代码和CMakeLists.txt列在下面:环境是Win11 + MSYS2 (MSYS2 -x86_64-20230318.exe)我在mingw64和clang64上测试了它们,两者的行为相同。

<标题>Hello/CMakeLists.txt h1> Hello/lib/CMakeLists.txt h1> Hello/lib/测试/CMakeLists.txt h1> Hello/lib/foo。
#ifndef __FOO_H
#define __FOO_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#ifdef _WINDLL
#define API __declspec(dllexport)
#else
#define API __declspec(dllimport)
#endif
#else
#define API
#endif
API int foo(int in);
#ifdef __cplusplus
}
#endif
#endif /* __FOO_H */
<标题>Hello/lib/foo.cpp h1> Hello/lib/测试/test0.cpp h1> 了Win11中的MSYS2/mingw64和MSYS2/clang64 env,我在CentOS 7x和Rocky 9x中也有相同的代码。在Linux下,一切正常。

在做了更多的研究之后,仍然不清楚为什么std::string会导致0xc0000135错误。但我很确定std::string与这个问题无关。这纯粹是CTest无法读取PATH的问题,所以它找不到DLL。

有三种方法可以解决这个问题:

  1. WORKING_DIRECTORY添加到add_test(),设置为DLL的位置:
add_test(NAME test0 COMMAND test0 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
  1. 使用ENVIRONMENT_MODIFICATION属性,将DLL的路径添加到path:
set_tests_properties(test0 PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:${CMAKE_BINARY_DIR}/lib")
  1. 这也是原来错误的根本原因。当直接修改ENVIRONMENT属性时,PATH的分隔符必须用反斜杠转义!!
set_tests_properties(test0 PROPERTIES ENVIRONMENT "PATH=${CMAKE_BINARY_DIR}/lib\;$ENV{PATH}")

相关内容

  • 没有找到相关文章

最新更新