抱歉,实际上我不知道这是 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)环境中运行正常 一个 std::string。但是如果我在 foo() 中声明一个 std::string,CTest 将失败并显示 0xc0000135 错误。我的意思是如果 foo() 看起来像这样
int foo(int in) {
printf("HELLO %d\n", in);
return in;
}
一切正常。但是
int foo(int in) {
str::string msg = "HELLO";
printf("HELLO %d\n", 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 上测试了它们,它们都有相同的行为。
cmake_minimum_required(VERSION 3.10)
project(Hello)
enable_testing()
include(CTest)
subdirs(lib)
set(CMAKE_CXX_FLAGS "-D_WINDLL")
add_library(foo SHARED foo.cpp foo.h)
target_include_directories(foo PRIVATE .)
subdirs(tests)
add_executable(test0 test0.cpp)
target_include_directories(test0 PRIVATE ${PROJECT_SOURCE_DIR}/lib)
target_link_libraries(test0 foo)
add_test(NAME test0 COMMAND test0)
if (WIN32)
set_tests_properties(test0 PROPERTIES ENVIRONMENT "PATH=${CMAKE_CURRENT_BINARY_DIR}\\..;$ENV{PATH}" )
endif()
#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 */
#include <foo.h>
API int foo(int i)
{
// std::string msg = "HELLO"; // uncomment this will cause strange error !!
printf("hello %d\n", i);
return i;
}
#include <foo.h>
int main(int argc, char *argv[])
{
return foo(0);
}
除了Win11中的MSYS2/mingw64和MSYS2/clang64 env,我在CentOS 7x和Rocky 9x中也是同样的代码。在 Linux 下,一切正常。 ctest 将通过。