C 在构建静态库时,跨.o文件的引用是否已解析?
例如,假设我构建了一个库a.lib,它有两个文件:foo.c和bar.c。foo.c调用bar.c中定义的函数C 在构建静态库时,跨.o文件的引用是否已解析?,c,linker,C,Linker,例如,假设我构建了一个库a.lib,它有两个文件:foo.c和bar.c。foo.c调用bar.c中定义的函数void bar() 现在假设我有一个我将要创建的可执行文件,它有两个文件:main.c和bar.c。此bar.c还定义了void bar(),但使用了不同的实现 当我将可执行文件与a.lib链接时,可执行文件将调用哪个void bar() 该库是libfoobar.a(或libfoobar.lib),位于目录/lib 库文件foo.c定义foo()和foo()调用bar() 库文件ba
void bar()
现在假设我有一个我将要创建的可执行文件,它有两个文件:main.c和bar.c。此bar.c还定义了void bar()
,但使用了不同的实现
当我将可执行文件与a.lib链接时,可执行文件将调用哪个void bar()
该库是libfoobar.a
(或libfoobar.lib
),位于目录/lib
库文件foo.c
定义foo()
和foo()
调用bar()
库文件bar.c
定义bar()
库源文件不在当前目录中
程序文件bar.c
还定义了bar()
——一种不同的实现
程序文件main.c
调用foo()
和bar()
您的链接命令行如下所示:
cc -o program main.o bar.o -L ./lib -lfoobar
然后:
- 程序将包含程序文件
bar.c
中的bar()
(因为它已明确包含在命令行中,位于库之前)
- 程序将包含库文件
foo.c
中的foo()
,但它调用的bar()
将是程序文件bar.c
中的,而不是库中的
如果涉及更多符号,因此库foo.c
调用的函数仅在库bar.c
中可用(程序bar.c
不实现所有这些函数),则链接将失败,因为程序包含程序的bar.c
(无条件),但它也需要库的bar.c
,但这给了函数bar()
”的双重定义,这是一个错误
曲折会变得很严重。简单的经验法则——不要这样做。也就是说,不要让程序的bar.c
提供在库的bar.c
中也可用的符号。如果你必须这样做,而且还有其他的切入点,那么你必须更加努力地工作
不要将库放在对象文件之前;然后,您将使用双重定义的bar()
失败。库在链接列表中查找对象文件。不过,您确实需要以正确的顺序获取多个(静态)库。或者使用特殊选项使加载程序重新扫描库等。请发布您的代码和尝试执行的操作