共享库中的全局变量如何自行设置?我正在尝试一个非常简单的库,我注意到全局std::string
没有保持其价值。这是我的完整代码:
:
#include <string>
#include <iostream>
using namespace std;
static string name;
__attribute__((constructor))
static void init() {
ios_base::Init init_ios;
name = "LIBFOO";
cout << "init name: " << name << endl;
}
extern "C" const char *get_name() {
return name.c_str();
}
libfoo.h中的:
#ifndef LIBFOO_H
#define LIBFOO_H
extern "C" const char *get_name();
#endif
在test.cxx中:
#include <iostream>
#include "libfoo.h"
int main() {
std::cout << "main name: " << get_name() << std::endl;
}
构建
g++ -o libfoo.so -shared -fPIC libfoo.cxx
g++ -o test test.c -L. -lfoo
执行命令
LD_LIBRARY_PATH=$PWD ./test
输出:
init name: LIBFOO
main name:
name
的价值在哪里?变量怎么可能自己设置?
答案 0 :(得分:0)
由于不同类型的构造函数(C ++ ctors与属性ctors)的顺序没有很好地定义,并且可能非常适合编译器(参见例如c-static-initialization-vs-attribute-constructor),所以你在这里踩到泥泞的地面。所以我的猜测是,首先你分配名称,然后运行默认构造函数,将其重置为空字符串。您可以通过逐步执行gdb下的init代码来验证这一点。