【问题标题】:Visual Studio C programming: Unresolved external symbol, but visible in watch windowVisual Studio C 编程:未解析的外部符号,但在监视窗口中可见
【发布时间】:2014-06-02 12:52:57
【问题描述】:

在我的 main.c 中,我有:

int myvar[4] = {0,1,2,3};

int main(int argc, char *argv[])
{
  ...................

}

当我尝试在另一个文件中访问 myvar 时,如下所示:

extern int myvar[4];

if (myvar[0] == 1) do something;

当我构建它时(清理项目后),观察到错误“LNK2001:未解析的外部符号_myvar”和“致命错误 LNK1120:1 未解析的外部”。但是,如果我单独注释 'if' 语句,则解决方案构建良好,我可以在调试模式下的监视窗口中观察 myvar 的正确值。我对为什么会发生这种情况感到困惑。任何帮助将不胜感激!

【问题讨论】:

  • 不同文件在同一个链接单元还是不同的链接单元(即两个不同的库)?
  • 两个不同的库@eckes
  • 我想知道你的“构建”是如何首先进入链接阶段的,因为(a)你不能在 C 中分配一个固定的数组,以及(b)@987654323 的声明@ 是非标准的(第二个参数是一个指向指针的数组 char ??),(c)if {myvar[0] == 1} 也不是合法的 C。检查拼写和声明,因为其中没有其他内容似乎是真正的代码,因此没有复制的机会。
  • 那只是草率地引用了代码,混淆了 C 和 Matlab ! :)

标签: c visual-studio linker extern


【解决方案1】:

由于您在评论中提到用法分为两个不同的库,因此您需要为 using 库(具有 extern int myvar[4]; 的库)设置一个依赖关系到 提供库(提供main函数并声明int myvar[4]的库)。

但是,这可能会导致您遇到循环依赖的问题:通常提供main 函数的库会调用其他库中的某些函数。

如果您在 using 库中需要 myvar,则将其传递给 init 函数,该函数会被调用以初始化 using 库。

假设main() 函数由lib_a 提供并且访问myvar 的库称为lib_b,则您要完成的工作示例:

lib_a 中执行以下操作:

int main(int argc, char *argv[])
{
  lib_b_init(sizeof(myvar)/sizeof(*myvar), myvar);
  /* rest of your code goes here */
}

lib_b中除了已经提供的功能外,添加以下内容:

static int* g_libb_myvar        = (int*) 0; /* local pointer to myvar of lib_a */
static int  g_libb_myvar_size   = 0;        /* to note the length of the array */

/* Initializer for lib_b
 *
 * @param    a_count  number of elements held in the a_myvar array
 * @param    a_myvar  array getting passed down by caller
 * */
void lib_b_init( int a_count, int* a_myvar ) {
  g_libb_myvar_size = a_count;
  g_libb_myvar      = a_myvar; /* now, you could use g_libb_myvar in lib_b */
}

【讨论】:

  • 谢谢!你能详细说明一下初始化部分吗@eckes
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多