我有以下问题:我使用以下类来初始化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)。我该如何解决这个问题?
答案 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之后以你描述的方式销毁。事实上,我在许多项目中使用过共享库,并且从未遇到过您描述的问题。 我理解一个库文件,只不过是一个目标文件的容器。 但是,那说......
如果您的代码对创建的对象没有任何作用,链接器可以自由删除它(删除死代码)。我建议确保引用静态对象。或许可以调用成员函数吗?