0

1)解决方案包含两个项目。项目 2 依赖于项目 1(在“项目依赖项”复选框组中选中)。项目 1 中的一部分类已声明和实现,但从未在代码中使用(创建任何实例)。要在 lua 中使用这些类,它们是使用 luabind 绑定的。绑定函数被声明为每个必须绑定的类的静态方法。它使用 cpp 中的代码自动调用,并使用类似“const bool is_bound = ClassName::Bind()”的内容。生成的结果是:项目 1 的静态库和项目 2 的可执行文件。

所有的类都在脚本中绑定和可用。

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

如何解决这个问题,造成它的原因是什么?提前致谢。

PS我尝试通过“模仿使用”(作为实验)使用强制链接手动解决它。我使用了这样的功能(我知道,它非常丑陋)

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>();

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

4

1 回答 1

0

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

它不会抓取引用库中的静态对象,这可能应该称为错误。为了克服这个问题,我们必须在主项目中明确引用所需的对象。事实上,您只需要引用目标文件,链接器将负责其余的工作。

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

int LinkFileName() { return 0; }

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

int linkFileName = LinkFileName();

这很荒谬,但它确实有效。

于 2012-02-16T14:49:22.023 回答