C ++代码的静态链接

时间:2013-05-31 12:54:41

标签: c++ cmake static-libraries

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

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

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

} hello_inst;

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

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

3 个答案:

答案 0 :(得分:1)

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

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

也许这可以解决您的问题

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

据我所知,库中定义的静态应该在main调用之前构造,并在main之后以你描述的方式销毁。事实上,我在许多项目中使用过共享库,并且从未遇到过您描述的问题。 我理解一个库文件,只不过是一个目标文件的容器。 但是,那说......

如果您的代码对创建的对象没有任何作用,链接器可以自由删除它(删除死代码)。我建议确保引用静态对象。或许可以调用成员函数吗?