【问题标题】:How to prevent Visual C Compiler from optimizing out "unused" global variable [duplicate]如何防止 Visual C 编译器优化“未使用”的全局变量 [重复]
【发布时间】:2012-12-14 22:25:23
【问题描述】:

可能重复:
Why does const imply internal linkage in C++, when it doesn’t in C?
What is external linkage and internal linkage in C++

我有两个 C 文件,我正在尝试将它们编译为可执行文件。一个文件只包含一个声明,如下(简化)。

const char *foo[2] = {"thing1", "thing2"};

第二个 c 文件执行此操作

extern const char *foo[2];
main()
{
 //Code that does stuff with foo
}

编译时出现链接器错误,提示 foo 是未解析的外部符号。我假设编译器正在优化 foo。这里有什么想法吗?

【问题讨论】:

  • 如何编译?您需要链接到包含定义的.c 文件中的目标文件。
  • 你用什么命令编译?听起来您只是在编译和链接第二个文件,而不是第一个。
  • 首先我分别编译这两个文件(这是我们的make系统这样做的)。然后它会这样做'link.exe file1.obj file2.obj extlib.lib /out:out.exe'
  • @YePhIcK:这是相关的,但 what?why? 是不同的问题。
  • 两个链接的答案都不相关。这个问题与 C++ 中 const 对象的内部链接无关。上述声明中的对象foo 不是const。这些声明的链接行为在 C 和 C++ 之间没有区别。

标签: c visual-studio-2010 visual-c++ linker


【解决方案1】:

您的声明没有任何问题。假设您添加明确的int 作为main 的返回类型,代码应该按原样编译和链接。我能想到的对链接器错误的唯一解释是您忘记向链接器提供所有必需的目标文件。

试图通过在 C++ 中 const 对象具有内部链接这一事实来解释此问题的答案具有误导性且无关紧要。上述对象foo 不是const 对象。

【讨论】:

  • 感谢您的回复。你知道订单目标文件是否传递给链接器吗?例如“link.exe file1.obj file2.obj lib1.lib”和“link.exe file2.obj file1.obj lib1.lib”有区别
  • @Brandon Yates:在处理 时,它对 GNU 链接器(甚至可能是任何 POSIX 链接器?)很重要。我不确定 MS 链接器。但是当输入只是 obj 文件(没有库)时,任何链接器的顺序都应该无关紧要。如果库是最后指定/处理的(如您的情况),您应该可以使用任何链接器。
  • 顺序无关紧要。如果顺序很重要,您的代码中有更大的问题(主要与初始化依赖项和重复符号的解决方案有关)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多