代码和截图: https://github.com/wjx0912/cmake_macos_cpptest https://github.com/wjx0912/cmake_macos_cpptest/raw/main/screenshot.png 万分感谢 std, cmake, string, maocs
猜测的原因:__attribute__((constructor))时,c++ runtime 还未初始化,std::string 的一些操作可能不稳定。 测试: ``` std::string g_test1; std::string g_test2; __attribute__((constructor)) static void init() { g_test1 = "hello test1"; printf("init: %s\n", g_test1.c_str()); } void hello_func1(void) { g_test2 = "hello test2"; printf("Hello World: %s, %s\n", g_test1.c_str(), g_test2.c_str()); return; } void hello_func2(void) { printf("Hello World: %s, %s\n", g_test1.c_str(), g_test2.c_str()); return; } ``` 在 hello_func2 里面,g_test1 无法打印,g_test2 正常。 不知道这个思路是否正确,求大神指点
``` 搞定了,把: std::string g_test1; std::string g_test2; 改成: __attribute__((init_priority(101))) std::string g_test1; __attribute__((init_priority(101))) std::string g_test2; 参考: https://stackoverflow.com/questions/43941159/global-static-variables-initialization-issue-with-attribute-constructor-i ```
```c++ #include #include #include #include #include "hello.h" std::string g_test = "initial value"; __attribute__((constructor)) static void init() { g_test = "hello test"; printf("init: %s\n", g_test.c_str()); } void hello_func(void) { printf("Hello World: %s\n", g_test.c_str()); return; } ``` 执行结果: ``` init: hello test Hello World: initial value ```