0

这个问题不是 Fubi 特有的,而是一般的链接器问题。过去几天(读作 5 天)充满了链接错误,但我设法将其缩小到少数几个。

我正在尝试在 Linux 环境下编译 Fubi(全身交互框架)。它只在 Windows 7 上进行了测试,并且网络缺乏在 *nix 平台上编译的资源。

现在,就像我上面提到的那样,我遇到了大量的链接问题,这些问题主要涉及不正确的 g++ 标志。Fubi 需要 OpenNI 和 NITE(以及 OpenCV,如果你愿意的话)来提供它的基本功能。我已经能够成功地编译来自 OpenNI 和 NITE 框架的两个样本。

据我了解,Fubi 是一个框架,因此我需要编译一个共享库而不是二进制文件。

当我尝试使用以下命令将其编译为二进制文件时

g++ *.cpp -lglut -lGL -lGLU -lOpenNI -lXnVNite_1_5_2 -I/usr/include/nite -I/usr/include/ni -I/usr/include/GL -I./GestureRecognizer/ -o FubiBin

我得到位于此处的输出。(有点长,我不想破坏格式)

如果我改为编译成目标文件(-c 标志),则不会出现错误并且它会成功构建目标文件。请注意,我正在使用以下命令:

g++ -c *.cpp -lglut -lGL -lGLU -lOpenNI -lXnVNite_1_5_2 -I/usr/include/nite -I/usr/include/ni -I/usr/include/GL -I./GestureRecognizer/ 

然后我可以使用该ar命令生成一个静态链接库。没有错误[可能]发生(这只是我的猜测)因为它还没有通过链接器运行,所以这些错误不会出现。

感谢您耐心阅读所有内容。最后,提问时间:

1)尝试编译为二进制文件时,第一个错误是关于未定义对 main normal 的引用吗?我搜索了该文件夹中的所有文件,但没有一个主要功能存在。

2)其余未定义的参考错误抱怨他们找不到提到的功能。所有这些函数都位于子目录GestureRecognizer/中的 .cpp 和 .h 文件中,这是我正在编译的路径的子目录。那么参数不会解决-I./GestureRecognizer/这个问题吗?

我想确保当我创建共享库时,在运行时不会出现任何链接问题。如果最初链接正确,所有这些错误在尝试编译为二进制文件时会消失吗?

4

1 回答 1

0

您告诉编译器在第一次调用中创建一个可执行文件,而一个可执行文件需要一个main()它找不到的函数。所以不,错误是不正常的。为了创建一个共享库,使用 GCC 的“-shared”选项。在这里尝试一些测试代码,在我的系统上编译时它也需要“-fPIC”,但这可能会有所不同。最好的想法是剖析在您的系统上正确构建的其他一些库的编译器和链接器命令行。

为了从子目录中添加缺少的符号,您也必须编译它们:g++ *.cpp ./GestureRecognizer/*.cpp .... “-I...”仅告诉编译器在找到#include .... 如果这甚至不是必需的,我不会感到惊讶,许多项目都使用#include "GestureRecognizer/Foo.h"直接实现这一目标。

顺便提一句:

  • 考虑在运行编译器时激活警告(“-W...”)。
  • 您可以在编译(“-c”)和链接之间进行拆分。在这两种情况下,请使用“g++”。在测试不同的链接器设置时,这应该会减少您的周转时间。
于 2013-01-16T06:19:02.010 回答