Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是Microsoft Visual Studio相当于GCC ld选项--整个归档_C++_Visual C++_Linker_Static Libraries - Fatal编程技术网

C++ 什么是Microsoft Visual Studio相当于GCC ld选项--整个归档

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++()有什么类似的东西吗? --全部档案 对于命令行中在 `--“整个存档”选项,包括存档中的每个对象文件 在链接中,而不是在存档中搜索所需的 对象文件。这通常用于将存档文件转换为 共享库

当针对可执行文件链接静态库时,通常会丢弃未引用的符号。在我的例子中,一些未使用的对象被用来将它们各自的类注册到工厂中,如果这些对象被丢弃,则注册失败

在使用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文件。哇,这太大了。谢谢你提供的信息。