提问人:Kevin Basta 提问时间:9/25/2023 更新时间:9/25/2023 访问量:74
静态 C 库会导致文件名冲突吗?
Can a static C library cause filename collisions?
问:
我的静态 c 库 libmylib.a 包含常见的文件名,例如 array.o 和 linkedlist.o
如果使用我的库的用户有同名的文件(array.c 和 linkedlist.c),他们最终会出现编译错误吗?共享库也会如此吗?
我用下面的makefile对此进行了测试,但是我没有收到任何错误。 为什么链接时有两个array.o文件时不会出现任何错误?
OBJECTS = array.o main.o
main: $(OBJECTS)
gcc $(OBJECTS) -Llibs/ -lmylib -lm
array.o: array.c array.h
gcc -c array.c
main.o: main.c
gcc -c main.c
答:
0赞
nielsen
9/25/2023
#1
简短的回答是“不”。C 库将在源代码中导出相应的符号定义,并且不依赖于源代码文件的名称。
潜在的问题是,如果在库和用户代码中都定义了,例如具有相同名称的函数。array.o
array.o
一般规则是,如果传递给链接器的代码模块和库包含两个同名的符号,则链接器将使用它首先遇到的符号。由于链接的顺序通常是“首先是用户代码,然后是库”,因此这允许用户代码覆盖(从而忽略)库中的定义。由于这是一个“功能”,链接器甚至不会发出警告或错误(请参阅为什么链接器不抱怨重复的符号?(C++,但在此上下文中无关紧要))。
相同的功能可以使一个库使另一个库中的符号黯然失色,因此在编写库时避免使用过于通用的名称是一个好主意。这有时是通过为所有导出的名称提供一个通用前缀来实现的(例如 而不仅仅是)。mylib_get_size()
get_size()
评论