强制visual studio链接lib文件中的所有符号

Lod*_*dle 23 c++ linker visual-studio

有没有办法强制visual studio将lib文件中的所有符号链接到dll中,因为它正在优化程序在运行时使用dll所需的"未使用"函数.

我尝试使用/ OPT:NOREF和/ OPT:NOICF,但它们似乎不起作用.

我需要它们的原因是因为它们是全局类,它们用控制器注册它们并且它们没有在dll中链接.

And*_*ant 21

我不知道在Visual Studio中是否有更优雅的方式,但我们使用它的跨平台解决方案有两个宏强制将problamatic目标文件链接起来.

一个放在被排除的函数的源文件中,另一个放在链接器知道将被调用的函数中.

就像是;

#define FORCE_LINK_THIS(x) int force_link_##x = 0;

#define FORCE_LINK_THAT(x) { extern int force_link_##x; force_link_##x = 1; }
Run Code Online (Sandbox Code Playgroud)

它不是很优雅,但我们还没有找到适用于跨平台的更好的解决方案.


Ofe*_*lon 5

实际上,有一个半官方的解决方案,就在这里

TL; DR:

“使用库依赖项输入”

在VS术语中,“库依赖项输入”是构成库的obj文件的名称。您实际上可以在两个范围内控制此行为:

  1. 每次引用:通过引用属性中的“使用库依赖项输入”组合。这是我个人使用的解决方案,也是帖子中提到的解决方案。使用库依赖输入

  2. 对于整个可执行文件:在exe项目属性中/ C ++ / Linker / General /使用库依赖项输入->是

这些奥秘设置的历史动机是在以前没有的位置启用增量链接,但是它具有直接链接到打包在lib中的obj文件的链接的有用副作用,从而也构造了未引用的全局对象。