全局字符串在共享库中取消设置

时间:2016-11-24 14:43:53

标签: c++ linux g++ global-variables shared-libraries

共享库中的全局变量如何自行设置?我正在尝试一个非常简单的库,我注意到全局std::string没有保持其价值。这是我的完整代码:

libfoo.cxx中的

#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的价值在哪里?变量怎么可能自己设置?

1 个答案:

答案 0 :(得分:0)

由于不同类型的构造函数(C ++ ctors与属性ctors)的顺序没有很好地定义,并且可能非常适合编译器(参见例如c-static-initialization-vs-attribute-constructor),所以你在这里踩到泥泞的地面。所以我的猜测是,首先你分配名称,然后运行默认构造函数,将其重置为空字符串。您可以通过逐步执行gdb下的init代码来验证这一点。