c++代码的静态链接

Static linking of C++ code

本文关键字:链接 静态 代码 c++      更新时间:2023-10-16

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

class Hello
{
public:
  Hello()
  {
    cout << "Hello world" << endl;
  }
  ~Hello()
  {
    cout << "Goodbye cruel world" << endl;
  }
} hello_inst;

如果我在hello。Cc文件并将其与包含my main()的另一个文件一起编译,然后在调用之前创建hello_inst并在调用之后销毁它主要()。在本例中,它只打印一些行,在我的项目中,我通过LIBXML_TEST_VERSION .

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

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

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

也许这能解决你的问题

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

通常在第一次实际使用库中的某些内容(类、函数或变量)或实际使用变量本身时执行此操作。

如果你想强制使用hello_inst,调用它的函数,然后查看是否以及何时调用构造函数和析构函数。

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

据我所知,在库中定义的静态量应该在调用main之前构造,在调用main之后销毁,按照您描述的方式。的确,我在许多项目中使用过共享库,但从未遇到过你描述的问题。我理解一个库文件,比对象文件的容器多一点。但是,也就是说.....

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