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

Can a static C library cause filename collisions?

提问人:Kevin Basta 提问时间:9/25/2023 更新时间:9/25/2023 访问量:74

问:

我的静态 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 makefile 静态库

评论

0赞 HolyBlackCat 9/25/2023
不可能。如果您测试过并且没有错误,我不会担心。
0赞 Jerry Jeremiah 9/25/2023
库中的文件名无关紧要,但函数和结构很重要——库中的文件名是弱符号,如果有人编译具有相同函数或系统名称的文件,他们的文件名将具有优先权(en.wikipedia.org/wiki/Weak_symbol)。

答:

0赞 nielsen 9/25/2023 #1

简短的回答是“不”。C 库将在源代码中导出相应的符号定义,并且不依赖于源代码文件的名称。

潜在的问题是,如果在库和用户代码中都定义了,例如具有相同名称的函数。array.oarray.o

一般规则是,如果传递给链接器的代码模块和库包含两个同名的符号,则链接器将使用它首先遇到的符号。由于链接的顺序通常是“首先是用户代码,然后是库”,因此这允许用户代码覆盖(从而忽略)库中的定义。由于这是一个“功能”,链接器甚至不会发出警告或错误(请参阅为什么链接器不抱怨重复的符号?(C++,但在此上下文中无关紧要))。

相同的功能可以使一个库使另一个库中的符号黯然失色,因此在编写库时避免使用过于通用的名称是一个好主意。这有时是通过为所有导出的名称提供一个通用前缀来实现的(例如 而不仅仅是)。mylib_get_size()get_size()