此问题并非特定于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
我得到的输出位于here。 (这有点长,我不想破坏格式)
如果我改为编译成目标文件(-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 函数。
2)其余未定义的引用错误抱怨它们找不到所提到的功能。所有这些函数都位于子目录 GestureRecognizer / 中的.cpp和.h文件中,这是我正在编译的路径的子目录。所以参数-I./GestureRecognizer/
不会占用关心这个问题?
我想确保在创建共享库时,我在运行时不会遇到任何链接问题。如果它们最初正确链接,那么当尝试编译成二进制文件时,所有这些错误都会消失吗?
答案 0 :(得分:0)
您告诉编译器在第一次调用中创建可执行文件,而可执行文件需要main()
函数,它无法找到。所以不,错误不正常。要创建共享库,请使用GCC的“-shared”选项。在这里尝试一些测试代码,在我的系统上,它在编译时也需要“-fPIC”,但这可能会有所不同。最好的办法是剖析在您的系统上正确构建的一些其他库的编译器和链接器命令行。
为了从子目录中添加缺少的符号,您还必须编译它们:g++ *.cpp ./GestureRecognizer/*.cpp ...
。 “-I ...”仅告诉编译器何时找到#include ...
进行搜索。如果没有必要,我不会感到惊讶,许多项目使用#include "GestureRecognizer/Foo.h"
直接实现这一点。
顺便说一句: