1)解决方案包含两个项目。项目2取决于项目1(在“项目依赖关系”复选框组中选中)。 项目1中的一部分类是声明和实现的,但从未在代码中使用(任何实例都已创建)。要在lua中使用这些类,他们使用luabind绑定。绑定函数被声明为每个必须绑定的类的静态方法。它使用cpp中的代码自动调用,并使用类似“const bool is_bound = ClassName :: Bind()”的内容。 Buld结果是:项目1的静态lib和项目2的可执行文件。
所有类都以脚本绑定并可用。
2)我添加了项目3,取决于项目2.项目2的Buld结果是静态lib,项目3的构建结果是可执行的。因此,项目1中定义的所有或部分类都没有链接到二进制文件。问题 - 在启动程序后,它们不是绑定的ant,不能在脚本中使用。
如何解决这个问题以及造成这个问题的原因是什么?提前致谢。
P.S。我试图通过“模仿使用”(作为实验)使用强制链接手动解决它。我使用了这样的函数(我知道,它非常难看)
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>();
结果 - 部分开始链接而另一部分没有链接。
答案 0 :(得分:0)
当Visual Studio链接EXE或DLL时,它往往包含主项目中的每个静态对象以及主项目的每个导出函数。然后它跟踪该项目中的依赖项以及任何添加的库。
它不会在引用的库中获取静态对象,这可能应该被称为bug。为了解决这个问题,我们必须明确引用主项目中的所需对象。事实上,您只需要引用目标文件,链接器将负责其余的工作。
我使用Google Test遇到了这个问题,我学到的解决方案是这样的: 在lib项目的每个受影响的源文件中,添加:
int LinkFileName() { return 0; }
在DLL或EXE项目的任何文件中,添加:
int linkFileName = LinkFileName();
这很荒谬,但确实有效。