如何解决项目依赖的三个级别导致在VC ++ 2008中并非所有内容都被链接
|| 1)解决方案包含两个项目。项目2取决于项目1(在“项目依赖项”复选框组中选中)。 项目1中的部分类已声明并实现,但从未在代码中使用(创建了任何实例)。要在lua中使用这些类,必须使用luabind对其进行绑定。对于必须绑定的每个类,绑定函数都声明为静态方法。它使用cpp中的代码自动调用,并使用\“ const bool is_bound = ClassName :: Bind()\”之类的东西。可能的结果是:项目1的静态lib和项目2的可执行文件。 所有类均已绑定,并且可以在脚本中使用。 2)我已经添加了项目3,具体取决于项目2。项目2的结果可能是静态lib,项目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时,它倾向于包括主项目中的每个静态对象以及主项目中的每个导出函数。然后,它将跟踪该项目和所有添加的库中的依赖项。
它不会在引用的库中获取静态对象,这可能应该称为错误。为了克服这个问题,我们必须在主项目中显式引用所需的对象。如果确实如此,您只需要引用目标文件,链接器就会处理其余的工作。
我在使用Google Test时遇到了这个问题,我了解到的解决方案是这样的:
在lib项目的每个受影响的源文件中,添加:
int LinkFileName() { return 0; }
在DLL或EXE项目的任何文件中,添加:
int linkFileName = LinkFileName();
这很荒谬,但是可以。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。