【问题标题】:Why does the executable binary file contain paths of included header files?为什么可执行二进制文件包含包含头文件的路径?
【发布时间】:2015-07-20 07:34:13
【问题描述】:

为什么编译和链接的可执行文件包含我的源代码中包含的头文件的路径?我正在使用 wxWidgets 库并使用 Visual Studio 2013 和 gcc 进行编译。这些头文件是做什么用的?如果它是编译器选项,我该如何禁用它以避免这种情况?

构建配置:发布、静态链接。

【问题讨论】:

  • 这些是库的路径,而不是头文件的路径。当为库的动态链接编译/链接时,代码需要知道库的位置。 “静态”链接会使代码变得更大,但会删除那些不再需要的路径。

标签: c++ c wxwidgets


【解决方案1】:

此类字符串出现在可执行文件中可能有多种解释:

  • 您可能在可执行文件中捆绑了调试信息以供调试器使用。使用strip 删除它,或者不要使用-g 编译选项。您还应该使用定义的NDEBUG 进行编译以禁用调试代码和断言。 Release 模式通常是这种情况,但您可能需要仔细检查。
  • 某些函数可能使用__FILE__ 进行跟踪或记录。 __FILE__ 在宏展开点展开为源文件名,可以是源文件,也可以是头文件。一个这样的函数是assert():它实际上是一个扩展为测试的宏和一些包含当前文件名的错误报告代码。
  • 某些源可能具有static char 数组形式的静态源ID,以跟踪源代码版本。这种方法已经过时了,但许多旧的来源仍然有它们。

在可执行文件中出现名称的源文件或头文件中查找此类内容并修复问题。

【讨论】:

  • 单个 assert() 可能是原因(根据 chqrlie 列表的前两个项目)。用NDEBUG编译可能会去掉很多。
  • 我已经尝试剥离并将 wxDEBUG_LEVEL 定义为 0,它们没有工作。
  • @Gokhan Bora:你重新编译了所有东西吗?
  • 是的,重新编译项目,重新编译 wxWidgets 库。定义 wxDEBUG_LEVEL 后,二进制中的字符串较少。但是仍然有很多可读的字符串在 exe 文件中。谢谢你的帮助。
  • 屏幕截图中显示的字符串肯定来自断言消息,如果 wxDEBUG_LEVEL 设置为 0,则不应出现。要找出剩余字符串的来源,您需要将它们显示给我们。
【解决方案2】:

wxwidgets 在其头文件中有许多断言(例如,在wx/string.h 中,正如您所注意到的),全部使用在wx/debug.h 中定义的wxASSERT 宏 为了禁用这些,您可以在包含 any wxwidget 标头之前#define wxDEBUG_LEVEL 0

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 2021-07-11
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多