什么是Microsoft Visual Studio相当于GCC ld选项--whole-archive

fsc*_*itt 22 c++ linker static-libraries visual-c++

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

在我们使用gcc的Unix下,我可以将标志--whole-archive传递给链接器ld(参见下面的ld文档摘录),这使得ld不会丢弃任何对象.Visual C++有这样的东西吗?

--whole归档

    对于
    `--whole-archive'选项后命令行中提到的每个归档
    ,请在链接中包含归档中的每个目标文件,而不是在归档中搜索所需的
    目标文件.这通常用于将存档文件转换
    为共享库,从而强制将每个对象包含在
    生成的共享库中.此选项可能不止一次使用.

mrr*_*rry 23

Visual Studio 2015 Update 2中的Visual C++版本包含一个要link.exe调用的新标志/WHOLEARCHIVE,该标志具有与--whole-archive选项相同的功能ld.根据国旗文件:

/WHOLEARCHIVE选项强制链接器从指定的静态库中包含每个目标文件,或者如果未指定库,则从指定给LINK命令的所有静态库中包含每个目标文件.


Jer*_*fin 7

我相信最接近的等价物/OPT:NOREF.

  • 似乎没有任何效果,尤其是。考虑到它隐含在调试版本中。 (2认同)

Pau*_*lik 7

据我所知,没有单一的选择可靠地保证.有优化选项的组合(静默地)停用它,所以没有办法... /INCLUDE工作,但为此你需要提取和硬编码符号的错位名称.您有两种选择:(1)确保所有注册商都包含(包含)在翻译单元中,包含main并强制执行其使用.(2)放弃这个'成语'并使用明确的注册.

注意:这个答案现在已经快七年了,关于MSVC++工具链中选项可用性的陈述已经过时了.尽管如此,我仍然建议不要依赖注册商模式并查看备选方案.由于这个建议,请随意投票,但我想这对投票有点不公平,因为在此期间该选项被添加到Microsoft链接器.


ibr*_*him 5

您可以与 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")
Run Code Online (Sandbox Code Playgroud)

注意:/WHOLEARCHIVE仅适用于 Visual Studio 2015 Update 2+