C++ 什么是Microsoft Visual Studio相当于GCC ld选项--整个归档
当针对可执行文件链接静态库时,通常会丢弃未引用的符号。在我的例子中,一些未使用的对象被用来将它们各自的类注册到工厂中,如果这些对象被丢弃,则注册失败 在使用gcc的Unix下,我可以将标志--whole archive传递给链接器ld(请参阅下面ld文档的摘录),这样ld就不会丢弃任何对象。对于VisualC++()有什么类似的东西吗? --全部档案 对于命令行中在 `--“整个存档”选项,包括存档中的每个对象文件C++ 什么是Microsoft Visual Studio相当于GCC ld选项--整个归档,c++,visual-c++,linker,static-libraries,C++,Visual C++,Linker,Static Libraries,当针对可执行文件链接静态库时,通常会丢弃未引用的符号。在我的例子中,一些未使用的对象被用来将它们各自的类注册到工厂中,如果这些对象被丢弃,则注册失败 在使用gcc的Unix下,我可以将标志--whole archive传递给链接器ld(请参阅下面ld文档的摘录),这样ld就不会丢弃任何对象。对于VisualC++()有什么类似的东西吗? --全部档案 对于命令行中在 `--“整个存档”选项,包括存档中的每个对象文件 在链接中,而不是在存档中搜索所需的 对象文件。这通常用于将存档文件转换为 共享库
在链接中,而不是在存档中搜索所需的
对象文件。这通常用于将存档文件转换为
共享库,强制将每个对象包含在 生成的共享库。此选项可多次使用。
我相信最接近的等价物是 我习惯于强制包含未使用的符号。据我所知,没有一个选项可以可靠地保证这一点。有优化选项的组合(静默)停用此,所以没有办法
/INCLUDE
有效,但为此,您需要提取并硬编码符号的损坏名称。您有两种选择:(1)确保所有注册人都包含在包含main
的翻译单元中,并强制使用它们。(2) 放弃这个“习惯用法”,使用显式注册
警告:这个答案已经有7年历史了,关于MSVC++工具链中选项可用性的声明已经过时。尽管如此,我仍然建议不要依赖注册器模式,而是考虑其他替代方案。由于这项建议,请随意否决投票,但我想否决投票有点不公平,因为该选项同时被添加到Microsoft linker中。我使用了另一种方法-而不是将所有内容编译成
.lib
,然后将该.lib
链接到可执行文件,我将可执行文件直接链接到.obj
文件
在CMake中,可以这样制作:
add_library(common OBJECT ${common_sources})
add_executable(executable1 "main1.cc" $<TARGET_OBJECTS:common>
add_executable(executable2 "main2.cc" $<TARGET_OBJECTS:common>
add_库(公共对象${common_sources})
添加可执行文件(可执行文件1“main1.cc”$
添加可执行文件(可执行文件2“main2.cc”$
更改${common_sources}
中的任何文件只会重新编译它们的等效对象并重新链接可执行文件,这提供了与通过中间.lib
链接内容相同的好处。同时,所有静态构造函数保持不变,从而解决了问题
请注意,这仅在静态链接时才有用
这种方法在gcc 5.2.0、MinGW-w64 5.2.0和MSVC 15中进行了测试。在可执行文件的属性页中,查看公共属性/引用/使用库依赖项输入将其设置为true。这几乎相当于MS——简言之,就是整个存档
<>编辑:但是所讨论的库需要解决。< VisualStudio 2015更新2中的VisualC++的版本包括一个新的标志:“代码>链接.exe <代码> >代码< >代码> /Cult>。
/wholerchive
选项强制链接器包含每个对象
来自指定静态库的文件,或者如果没有库
从指定给LINK命令的所有静态库中指定
您可以与CMake一起使用,如:
add_executable(hello ${SOURCE_FILES})
target_link_libraries(hello libA libB libC) # Not need /wholearchive libC
set_target_properties(hello PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:libA /WHOLEARCHIVE:libB")
注意:
/WHOLEARCHIVE
仅适用于Visual Studio 2015 Update 2+谢谢。我创建了一个小程序,从静态库中提取所有符号名称,并将其包含在主程序中。显然,这在近两年后被无声地否决了两次。请你写一行说明原因好吗?@fschmitt您有没有找到更好的解决方案?我从静态库转到了dll,解决了这个问题,因为动态库中没有丢弃任何符号。感谢--整个归档文件的解释,我只是在搜索使用它的场景。似乎没有任何效果,特别是考虑到它隐含在de中bug生成。这应该,但根本不起作用,不仅仅对我来说。非常不幸。不,它将所有obj文件添加到链接器命令中,而不是lib文件。哇,这太大了。谢谢你提供的信息。