5

我有以下问题:我使用如下一些类来初始化 C 库:

class Hello
{
public:
  Hello()
  {
    cout << "Hello world" << endl;
  }

  ~Hello()
  {
    cout << "Goodbye cruel world" << endl;
  }

} hello_inst;

如果我将此代码包含在一个 hello.cc 文件中并将它与另一个包含我的 main() 的文件一起编译,那么 hello_inst 会在调用 main() 之前创建并在调用之后销毁。在这种情况下,它只打印一些行,在我的项目中,我通过 LIBXML_TEST_VERSION 初始化 libxml。

我正在创建多个可执行文件,它们在 cmake 项目中共享许多相同的代码。根据这个线程:在 CMake 中添加多个可执行文件我创建了一个包含上面显示的代码的静态库,然后将可执行文件链接到该库。不幸的是,在这种情况下 hello_inst 永远不会被创建(并且 libxml2 永远不会被初始化)。我该如何解决这个问题?

4

3 回答 3

1

我有一个类似的问题,并通过将我的库定义为静态来解决它。因此我使用了以下代码:

add_library( MyLib SHARED ${LBMLIB_SRCS} ${LBMLIB_HEADER})

也许这可以解决您的问题

于 2013-05-31T13:39:41.973 回答
0

没有强制共享库全局变量由标准初始化的官方方法,并且取决于编译器。

通常,这是在第一次实际使用该库中的某些内容(类、函数或变量)或实际使用变量本身时完成的。

如果要强制hello_inst使用,请在其上调用一个函数,然后查看是否以及何时调用了构造函数和析构函数。

阅读此线程以获取更多信息: http ://www.gamedev.net/topic/622861-how-to-force-global-variable-which-define-in-a-static-library-to-initialize/

于 2013-05-31T13:10:15.523 回答
0

据我所知,库中定义的静态应该在 main 被调用之前构造,并在 main 之后以您描述的方式销毁。确实我在很多项目中使用过共享库,从来没有遇到过你描述的问题。我理解一个库文件,只不过是一个目标文件的容器。然而,话虽如此......

如果您的代码对创建的对象不做任何事情,链接器可以自由地删除它(死代码删除)。我建议确保引用静态对象。调用成员函数,也许?

于 2013-05-31T15:04:37.660 回答