库和项目中的 class 名称相同
Same class name in library and project
如果我的主项目中有一个名为 ClassA 的 class,并且我有一个为静态库构建的子项目,在该子项目中有一个也名为 ClassA 的 class。我想知道我可以成功构建和运行,编译器如何区分这两个class?
您需要重命名其中一个 类 否则编译器会在构建您的代码时抛出错误。
我想你是在谈论 linker 的工作方式。
静态库是几个后缀为“.o”的可重定位目标文件的集合。您项目中的源文件也被编译成可重定位的目标文件。
当 linker 工作时,它将解析代码中使用的 ClassA
等符号。如果它在可重定位的目标文件中找到 - 比方说 rof1.o
,它会将 rof1.o
吸收到可执行文件中。当 link 尝试解析符号时,可重定位目标文件的搜索顺序决定了使用哪个 ClassA
。由于搜索顺序对我们来说是不确定的,您应该使用不同的 class 名称。
顺便说一句,如果您将其他 link 标志设置为“-all_load”,这表明 link 人员将尝试将所有可重定位目标文件组合到可执行文件中。那么如果有两个或多个相同的符号,就会报错"duplicated symbols".
如果我的主项目中有一个名为 ClassA 的 class,并且我有一个为静态库构建的子项目,在该子项目中有一个也名为 ClassA 的 class。我想知道我可以成功构建和运行,编译器如何区分这两个class?
您需要重命名其中一个 类 否则编译器会在构建您的代码时抛出错误。
我想你是在谈论 linker 的工作方式。
静态库是几个后缀为“.o”的可重定位目标文件的集合。您项目中的源文件也被编译成可重定位的目标文件。
当 linker 工作时,它将解析代码中使用的 ClassA
等符号。如果它在可重定位的目标文件中找到 - 比方说 rof1.o
,它会将 rof1.o
吸收到可执行文件中。当 link 尝试解析符号时,可重定位目标文件的搜索顺序决定了使用哪个 ClassA
。由于搜索顺序对我们来说是不确定的,您应该使用不同的 class 名称。
顺便说一句,如果您将其他 link 标志设置为“-all_load”,这表明 link 人员将尝试将所有可重定位目标文件组合到可执行文件中。那么如果有两个或多个相同的符号,就会报错"duplicated symbols".