使用静态lib乘以定义的符号

时间:2014-12-18 08:42:59

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

我有一个应用程序将静态库链接到visual studio(相同版本,同一台机器)。

这个lib包含多个带有多个函数的c文件(像往常一样)

作为例子

  • lib1.lib
    • file1.c中
      • func_f1_1
      • func_f1_2
    • file2.c中
      • func_f2_1
      • func_f2_2
  • prog1.exe
    • (链接lib1.lib)
    • 的main.cpp
      • 使用func_f2_2
    • strange.c
      • func_f1_1(相同的签名,不同的定义)
      • func_f2_1(相同的签名,不同的定义)

lib1是从prog1.exe独立构建的

在链接时,编译器会抱怨

lib1.lib(file2.obj): error LNK2005: _func_f2_1 already defined in strange.obj

链接器不会抱怨func_f1_1

我不完全理解这种错误,因为我预期链接器只会从未在目标可执行文件中定义的库中获取符号。

在我看来,链接器试图从lib而不是函数中输入整个obj的内容。

是否有任何项目设置可以更改以使链接器在功能级别上工作? "功能级别链接"在lib和程序项目的编译器属性中激活。

1 个答案:

答案 0 :(得分:3)

如果您的程序使用func_f2_2,则链接器会将定义lib1:file2.o的目标文件func_f2_2添加到对象列表中。该目标文件中的所有符号都链接到程序中。这包括func_f2_2以及func_f2_1可能使用的所有变量。

链接器不会抱怨func_f1_1,因为没有理由加载目标文件lib1:file1.o

如果您需要替换func_f2_1,还必须在strange.c中添加func_f2_2的定义。