在vc++ 2008中,三个级别的项目依赖关系导致不是所有的东西都链接在一起
Three levels of project dependencies cause not everything to be linked in VC++ 2008
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();
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- 迭代器关系运算符出错(带单独链接和迭代器的自定义哈希表)
- 使用C 中的链接seam break static变量依赖关系
- 模型依赖关系目标,在运行时链接
- 视觉如何引用部署与2015 C 链接库依赖关系
- Cmake不会将共享库的链接依赖关系传播到我的可执行文件
- 混合静态库和共享库时的链接器依赖关系
- 具有依赖关系的共享库的动态链接
- 仅针对直接依赖关系链接GCC/LD
- 通过两次链接同一个库来解决循环依赖关系
- 链接器错误:模板关系运算符
- 指定当一个静态库依赖于另一个静态库时所需的链接依赖关系
- 在vc++ 2008中,三个级别的项目依赖关系导致不是所有的东西都链接在一起