我的静态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
简短的回答是“不”。 C 库会导出源代码中对应定义的符号,并且不依赖于源代码文件的名称。
潜在的问题是,如果库中的
array.o
和用户代码中的 array.o
都定义了,例如具有相同名称的函数。
一般规则是,如果传递给链接器的代码模块和库包含两个同名的符号,链接器将使用第一个遇到的符号。由于链接的顺序通常是“首先是用户代码,然后是库”,这允许用户代码覆盖(从而覆盖)库中的定义。由于这是一个“功能”,链接器甚至不会发出有关它的警告或错误(请参阅为什么链接器不抱怨重复符号?(C++,但在这种情况下并不重要))。
相同的功能可以使一个库使另一个库中的符号黯然失色,因此在编写库时避免过于通用的名称是个好主意。有时,这可以通过为所有导出的名称指定一个通用前缀来实现(例如,使用
mylib_get_size()
而不是仅使用 get_size()
)。