我正在处理一些遗留的C ++代码,这些代码的行为方式我无法理解。 我使用的是Microsoft编译器,但我也尝试过使用g ++(在Linux上)进行相同的行为。
    我下面列出了4个文件。 从本质上讲,它是一个注册表,用于跟踪成员列表。 如果我编译所有文件并将目标文件链接到一个程序中,则会显示正确的行为:registry.memberRegistered为true:

    1. >cl shell.cpp registry.cpp member.cpp
    2. >shell.exe
    3. 1

    因此,以某种方式执行了member.cpp中的代码(我不太了解,但是可以)。 但是,我想要的是从Registry.cpp和member.cpp构建一个静态库,并将其链接到从shell.cpp构建的可执行文件。 但是,当我这样做时,member.cpp中的代码未得到执行,registry.memberRegistered为false:

    1. >cl registry.cpp member.cpp /c
    2. >lib registry.obj member.obj -OUT:registry.lib
    3. >cl shell.cpp registry.lib
    4. >shell.exe
    5. 0

    我的问题是:它为什么会以第一种方式而不是第二种方式起作用,是否有办法(例如,编译器/链接器选项)使其以第二种方式工作?

    ANS:
    这是链接器对待库的方式的结果:它们会选择那些—迄今未处理过的其他Object剩下的仍没有定义的Symbol。
    这有助于减小可执行文件的大小,但是当静态初始化有副作用时,它会导致您发现的fishy的行为:member.obj / member.o根本没有链接到程序,尽管它确实存在会做某事。

    静态库嵌套

    使用attribute

    cmake

    环境