我正在处理一些遗留的C ++代码,这些代码的行为方式我无法理解。 我使用的是Microsoft编译器,但我也尝试过使用g ++(在Linux上)进行相同的行为。
我下面列出了4个文件。 从本质上讲,它是一个注册表,用于跟踪成员列表。 如果我编译所有文件并将目标文件链接到一个程序中,则会显示正确的行为:registry.memberRegistered为true:
>cl shell.cpp registry.cpp member.cpp>shell.exe1
因此,以某种方式执行了member.cpp中的代码(我不太了解,但是可以)。 但是,我想要的是从Registry.cpp和member.cpp构建一个静态库,并将其链接到从shell.cpp构建的可执行文件。 但是,当我这样做时,member.cpp中的代码未得到执行,registry.memberRegistered为false:
>cl registry.cpp member.cpp /c>lib registry.obj member.obj -OUT:registry.lib>cl shell.cpp registry.lib>shell.exe0
我的问题是:它为什么会以第一种方式而不是第二种方式起作用,是否有办法(例如,编译器/链接器选项)使其以第二种方式工作?
ANS:
这是链接器对待库的方式的结果:它们会选择那些—迄今未处理过的其他Object剩下的仍没有定义的Symbol。
这有助于减小可执行文件的大小,但是当静态初始化有副作用时,它会导致您发现的fishy的行为:member.obj / member.o根本没有链接到程序,尽管它确实存在会做某事。
静态库嵌套
- c++ - Nested Static Linked Libraries and a Spooky Bug - Stack Overflow
- c++ - Are Nested Static Library dependencies possible? - Software Engineering Stack Exchange
- gcc nested libraries and linker dependencies - Stack Overflow
使用attribute
- Solved: How to force link of unused function? - Intel Communities
- Compiler User Guide: attribute((used)) variable attribute)%20is%20tagged,(%20(used))%20to%20build%20tables%20in%20the%20object.%3Fmsclkid=478bb0b0af1011ecb73137012dd996b1)
- attribute((used)) attribute((section(x)))_EmbededCoder的博客-CSDN博客
- c - prevent gcc from removing an unused variable - Stack Overflow
cmake
- target_link_library的顺序 c++ - cmake: In which order do I have to specify TARGET_LINK_LIBRARIES - Stack Overflow
- target_link_library的默认可见性(privacy) c++ - What is default target_link_libraries privacy setting? - Stack Overflow
环境
