静态C库会导致文件名冲突吗?

xoshrz7s  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(114)

我的静态c库libmylib. a包含常用的文件名,如array.o和linkedlist.o
如果一个使用我的库的用户有相同名称的文件(array.c和linkedlist.c),它们最终会出现编译错误吗?共享库也是如此吗?
我用下面的makefile测试了一下,但是没有错误。当有两个数组.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
dgiusagp

dgiusagp1#

简短的回答是“不”。C库将导出源代码中相应定义的符号,并且不依赖于源代码文件的名称。
潜在的问题是,如果库中的array.o和用户代码中的array.o都定义了,例如,一个同名的函数。
一般规则是,如果传递给链接器的代码模块和库包含两个同名的符号,链接器将使用它首先遇到的符号。由于链接的顺序通常是“用户代码优先,然后是库”,这允许用户代码覆盖(从而覆盖Eclipse)库中的定义。由于这是一个“特性”,链接器甚至不会发出关于它的警告或错误(参见Why doesn't the linker complain of duplicate symbols?(C++,但在此上下文中无关紧要))。
同样的特性可以使one library eclipse symbols in another library,所以在编写库时避免太通用的名称是一个好主意。这有时是通过给所有导出的名称一个公共前缀来实现的(例如,mylib_get_size()而不是get_size())。

相关问题