如何强制在visual studio中链接库中的对象模块或符号

时间:2014-08-21 07:56:47

标签: c++ visual-studio-2008 linker

我有一些遗留的C ++代码,我不想移动到(静态)库(.lib)。 但是,遗留的C ++代码使用全局对象的构造函数来进行一些初始化(请不要讨论这可能是不好的做法 - 它基本上可以工作,它的遗留代码我不想改变)。只要全局对象成为.exe的一部分,只要源代码及其包含该全局对象的.obj文件是visual studio(2008)中的.exe项目的一部分,就会发生这种情况。如果我将模块移动到库中,链接器将不包含此模块,因为它不会被.exe的任何模块引用。所以我需要强制将该模块链接到.exe

我知道链接器cmd行选项/ INCLUDE,我也可以使用#pragma comment(linker,“/ iclude:...”)指定。但是,有一些问题:

  1. 我需要指定C ++对象的修饰名称。我可以通过一些虚拟的extern“C”符号解决这个问题,例如int,仍然不太好,并且有很多。
  2. 我要么必须在链接器命令行中指定所有符号(正如我所提到的,它们有很多),或者,如果我使用#pragma,则#pragma语句必须是.exe的某个模块的一部分(或作为头文件包含在这样的模块中)。将#pragma放入定义符号的源代码(在库中)并不起作用。因此,两种方式都强制通过.exe的构建过程(通过命令行或.exe的源代码)链接符号,而不是通过库的代码。
  3. 所以我正在寻找的是Visual Studio 2008中的一种方法,通过定义库模块来强制链接模块,如:“如果库X.lib被指定为链接器的输入,那么模块Y.无论其他模块是否引用任何引用,X.lib的obj将始终链接到.exe。最好不要使用装饰名称。

1 个答案:

答案 0 :(得分:1)

所以我要回答我自己的问题。事实上,这是另一种解决方法。

解决方法不是链接器选项,而是VS设置,只有在.lib和.exe都在同一个解决方案中并且.exe​​中的.exe与.lib的依赖关系正确分离时才有效。解决方案设置。

在" Linker Property Page" .exe集的VS项目"使用库依赖项输入"到"是"所以.lib的.obj将被用来代替.lib作为链接器输入。由于链接器包含指定为输入的所有.obj(无论是否引用),因此效果类似于将.lib的所有源模块指定为.exe项目本身的一部分。

http://msdn.microsoft.com/en-us/library/024awkd1%28v=vs.90%29.aspx

一个缺点是,此设置不是.lib特定的。它会影响解决方案中的所有依赖.lib(但不会影响指定为附加输入的库)。检查链接器命令行以了解效果。