如果我的主项目中有一个名为ClassA的类,并且我有一个为静态库构建的子项目,则在此子项目中还有一个名为ClassA的类。我想知道我可以成功构建和运行,编译器如何区分这两个类?
答案 0 :(得分:2)
我认为你在谈论链接器是如何工作的。
静态库是几个可重定位目标文件的集合,后缀为" .o"。项目中的源文件也会编译为可重定位目标文件。
当链接器工作时,它将解析代码中使用的ClassA
之类的符号。如果它发现在可重定位目标文件中 - 让我们说rof1.o
,它会将rof1.o
吸收到可执行文件中。链接器尝试解析符号时,可重定位目标文件的搜索顺序决定了使用哪个ClassA
。由于搜索顺序对我们来说是不确定的,因此您应该使用不同的类名。
BTW如果将其他链接标志设置为' -all_load',这表示链接器将尝试将所有可重定位目标文件组合到可执行文件中。然后,如果有两个或多个相同的符号,它将显示错误"重复的符号"。
答案 1 :(得分:1)
您需要重命名其中一个类,否则编译器在构建代码时会抛出错误。