【问题标题】:Static library having object files with same name containing static variables with same name具有同名目标文件的静态库,其中包含同名静态变量
【发布时间】:2019-03-14 22:03:09
【问题描述】:

假设我们有这个源代码树:

.
└── src
    ├── foo
    │   ├── common.c
    │   └── foo.c
    └── bar
        ├── common.c
        └── bar.c

src/foo/common.csrc/bar/common.c 中,我们在两个文件中都有不同的static 变量,名为common_var,显然对应不同的变量。

所有文件将编译成tmp/中的类似树(包括tmp/foo/common.stmp/bar/common.s),然后组装成目标文件(包括tmp/foo/common.otmp/bar/common.o),所有这些目标文件都会去进入lib/libfoobar.a,将被某些程序使用。

以此文件树结尾:

.
├── lib
│   └── libfoobar.a
├── src
│   ├── foo
│   │   ├── common.c
│   │   └── foo.c
│   └── bar
│       ├── common.h
│       └── bar.hpp
└── tmp
    ├── foo
    │   ├── common.o
    │   ├── common.s
    │   ├── foo.o
    │   └── foo.s
    └── bar
        ├── common.o
        ├── common.s
        ├── bar.o
        └── bar.s

可以吗,还是会出现编译器/链接器/任何问题?

相关:Static library having object files with same name (ar)

这里的区别是内容可能会发生冲突。

【问题讨论】:

    标签: c static linker


    【解决方案1】:

    全局静态变量具有内部链接,因此即使名称没有差异,也无法将它们视为相同。

    不会有冲突。

    【讨论】:

    • 静态库增量更新会有问题。由于ar 不存储路径,ar r 将替换任何现有的bar.ocommon.o,无论它们来自tmp/foo/tmp/bar/
    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    相关资源
    最近更新 更多