在vc++ 2008中,三个级别的项目依赖关系导致不是所有的东西都链接在一起

Three levels of project dependencies cause not everything to be linked in VC++ 2008

本文关键字:关系 链接 在一起 依赖 项目 2008 vc++ 三个      更新时间:2023-10-16

1)方案包含两个项目。项目2依赖于项目1(在"项目依赖关系"复选框组中选中)。项目1中的部分类被声明和实现,但从未在代码中使用(创建任何实例)。要在lua中使用这些类,需要使用luabind对它们进行绑定。绑定函数声明为必须绑定的每个类的静态方法。它使用cpp中的代码自动调用,并使用类似"const bool is_bound = ClassName::Bind()"的东西。构建结果为:项目1为静态库,项目2为可执行库。

所有的类都被绑定在脚本中。

2)我已经添加了项目3,依赖于项目2。项目2的构建结果是静态库,项目3的构建结果是可执行的。因此,项目1中定义的所有或部分类根本没有链接到二进制文件。问题-在启动程序后,它们不被绑定,不能在脚本中使用。

如何解决这个问题,造成这个问题的原因是什么?

注:我尝试通过"模仿使用"的方式手动使用强制链接来解决(作为实验)。我使用了这样的函数(我知道,它非常丑陋)

template <class T, class A1, class A2>
void ForceLinking()
{
   boost::function<void(A1, A2)> f =
       boost::bind<T>(boost::lambda::constructor<T>(), _1, _2);
}
ForceLinking<ClassName, const string&, bool>();

结果,部分开始链接,而另一部分没有。

当Visual Studio链接EXE或DLL时,它倾向于包括主项目中的每个静态对象和主项目的每个导出函数。然后跟踪该项目和任何添加的库的依赖关系。

它不抓取引用库中的静态对象,这可能应该被称为一个bug。为了解决这个问题,我们必须在主项目中显式地引用所需的对象。事实上,你只需要引用目标文件,链接器会处理剩下的事情。

我在Google Test中遇到了这个问题,我学到的解决方案是这样的:在每个受影响的lib项目源文件中,添加:

int LinkFileName() { return 0; }

在DLL或EXE项目的任何文件中,添加:

int linkFileName = LinkFileName();