对不起,实际上我不知道这是一个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。
有三种方法可以解决这个问题:
- 将
WORKING_DIRECTORY
添加到add_test()
,设置为DLL的位置:
add_test(NAME test0 COMMAND test0 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
- 使用
ENVIRONMENT_MODIFICATION
属性,将DLL的路径添加到path:
set_tests_properties(test0 PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:${CMAKE_BINARY_DIR}/lib")
- 这也是原来错误的根本原因。当直接修改
ENVIRONMENT
属性时,PATH
的分隔符必须用反斜杠转义!!
set_tests_properties(test0 PROPERTIES ENVIRONMENT "PATH=${CMAKE_BINARY_DIR}/lib\;$ENV{PATH}")