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

标签 c++ qt fonts constructor startup

我有一个使用 Qt 的共享库版本 (5.2.0) 编写的程序,它可以正常显示字体(大概是从/usr/share/fonts 填充它的数据库)。 (不确定设计器文本是否与编程字体处理来自同一个数据库。)但后来我在开源静态版本(5.2.0)下重新编译它,字体变丑了。

我破坏了安装 Qt 的路径(因为静态版本的整个想法是独立于开发目录)并且果然它提示无法访问任何字体。所以我得出结论,Qt 将其静态版本更改为不再输入/usr/share/fonts。互联网上的一些研究告诉我,他们反而会查看 ...somedir/lib/fonts。

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

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

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

最佳答案

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

如果您需要可移植解决方案,那么目前确实没有。

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

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

关于c++ - 您如何确定全局构造函数的优先级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35952711/

相关文章:

python - 如何更改图例中字体的文本颜色?

javascript - Qt 5.4 beta WebEngineView调试

c++ - 构建Qt应用程序时出错:/bin/sh: -c: line 1: syntax error: unexpected end of file

qt - Qt应用程序的多平台崩溃报告系统

unicode - Apple 的文本渲染如何绘制字体没有的字形?

fonts - 想要嵌入字体但无法从 Font Suitcase 或 PostScript Type 1 文件转换

c++ - STL 删除没有按预期工作?

c++ - 为什么在Vim中cscope和ctags的组合会显示与类无关的函数定义的结果?

c++ - 将 Haskell ByteString 转换为 C++ std::string

数据比较的C++警告