我有一个应用程序将静态库链接到visual studio(相同版本,同一台机器)。
这个lib包含多个带有多个函数的c文件(像往常一样)
作为例子
func_f1_1
func_f1_2
func_f2_1
func_f2_2
func_f2_2
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和程序项目的编译器属性中激活。
答案 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
的定义。