您如何确定全局构造函数的优先级?

时间:2016-03-12 01:39:09

标签: c++ qt fonts constructor startup

我有一个使用Qt共享库版本(5.2.0)编写的程序,它显示的字体没问题(大概是从/ usr / share / fonts填充它的数据库)。 (不确定Designer文本是否来自与编程字体处理相同的数据库。)然后我在开源静态版本(5.2.0)下重新编译它,字体变得丑陋。

我中断了已安装的Qt的路径(因为静态版本的整个想法是独立于开发目录)并且肯定会抱怨无法访问任何字体。所以我总结了Qt将他们的静态版本改为不再输入/ usr / share / fonts。在互联网上进行的一项研究告诉我,他们反而看看... somedir / lib / fonts。

通过更多的研究,我发现我可以使用env var QT_QPA_FONTDIR来设置搜索目录(虽然我怀疑它可能已经缩减为一级搜索,而不是递归)。不想在调用程序之前编写脚本来包装程序并设置环境变量,我继续在程序中使用putenv()。我选择了一个我认为在Qt读取环境之前设置变量的地方,并且由于全局结构在main()之前调用,当然在QApplication实例化之前,我把它放在构造函数中。

但是,猜猜看,他们似乎在我的构造函数设置QT_QPA_FONTDIR = / usr / share / fonts之前读取了环境。

所以请帮忙!!!!如何让MY构造函数先执行?

2 个答案:

答案 0 :(得分:2)

有些编译器提供了试图帮助你做这些事情的编译指示,但简单的事实是C ++不能保证模块之间的全局构造顺序。甚至不能保证在另一个模块中依赖于另一个对象的一个​​对象将被初始化为第二个。全球在这方面是一个雷区。

如果您需要便携式解决方案,那么确实没有。

如果您可以保证您的编译器始终具有相同的风格,那么您可以使用诸如编译指示,属性或链接顺序之类的黑客来解决问题。例如,gcc提供了一个名为init_priority的变量属性,但我不确定你的优先级是否高于默认值。

真的,以另一种方式解决问题会更好。

答案 1 :(得分:0)

谢谢Aiken Drum。链接顺序有效。我创建了最小的.cpp,它使构造函数全局实例化,调用putenv()来设置我的环境。我把它放在.pro文件中,并检查它创建的makefile是否首先在链接行中。而且,嘿presto !! Qt程序现在从正确的位置获取字体数据库。非常感谢。它是设置构造函数顺序的链接顺序(至少使用GCC)。