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

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

抱歉,实际上我不知道这是 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 上测试了它们,它们都有相同的行为。

你好/CMakeLists.txt

    cmake_minimum_required(VERSION 3.10)
    project(Hello)

    enable_testing()
    include(CTest)

    subdirs(lib)

你好/lib/CMakeLists.txt

    set(CMAKE_CXX_FLAGS "-D_WINDLL")

    add_library(foo SHARED foo.cpp foo.h)
    target_include_directories(foo PRIVATE .)
    subdirs(tests)

你好/lib/tests/CMakeLists.txt

    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()

你好/lib/foo.h

    #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 */

你好/lib/foo.cpp

    #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;
    }

你好/lib/tests/test0.cpp

    #include <foo.h>
    int main(int argc, char *argv[])
    {
        return foo(0);
    }

除了Win11中的MSYS2/mingw64和MSYS2/clang64 env,我在CentOS 7x和Rocky 9x中也是同样的代码。在 Linux 下,一切正常。 ctest 将通过。

c++ cmake std msys2 ctest
© www.soinside.com 2019 - 2024. All rights reserved.