大家好,
注意-这个问题已经解决了-我在回答部分提供了自己的解决方案,但是Jonathan提供的解决方案要短得多。不过,这是我最初发布的以下问题:
我基本上是想在Linux上编译一个串行库(用于UART通信),但是我并不确定如何正确编译(我在下面已经提到了我所做的),任何建议都是非常有价值的。我正在使用serialib库-它由两个主文件(serialib.h和serialib.cpp)组成,您可以在这里直接查看这些文件的源代码(一直滚动到底部并在新选项卡中查看文件):http://serialib.free.fr/html/classserialib.html
我把这些文件(serialib.h和serialib.cpp)传输到我的BeagleBone黑色微控制器,它运行Debian(喘息)、g++/gcc(Debian 4.6.3-14)4.6.3。我编写了自己的程序(uart.cpp是我的文件名)来访问这个库提供的函数,这是我编写的:
#include <iostream>
#include "serialib.h"
#ifdef __linux__
#define DEVICE_PORT "/dev/ttyO1"
#endif
int main()
{
serialib LS;
return 0;
}
如你所见,我正试图访问“seriallib”类。serialib.h、serialib.cpp和uart.cpp都在主目录中。我还在serialib.cpp中手动添加iostream库,因为我没有看到它在原始源代码中被声明。
现在我真的不知道如何编译这样的外部库,但到目前为止,我尝试了以下步骤:
g++-c-Wall-Werror-fPIC serialib.c转换为PIC,会产生以下错误:
distcc[3142](dcc_parse_hosts)警告:/home/debian/.distcc/zeroconf/hosts不包含任何主机;无法分发工作
distcc[3142](dcc_zeroconf_add_hosts)严重!无法分析主机文件。
distcc[3142]警告:无法分发,而是在本地运行
g++serialib.cpp-L/home/debian/serialib.h,这会导致以下错误:
/usr/lib/gcc/arm linux gnueabihf/4.6/../../../arm linux gnueabihf/crt1.o:在函数中
_start':(.text+0x30): undefined reference to
main'LCD返回1退出状态
distcc[3210]错误:在本地主机上编译serialib.cpp失败
到目前为止,我仍然在寻找如何编译这个,如果我设法解决这个问题,我会把我的解决方案也张贴在这里。再一次,任何建议都是非常有价值的。谢谢你们:)。
最佳答案
g++ -c -Wall -Werror -fPIC serialib.c
转换为PIC会产生以下错误:
“错误”不是一个错误,而是一个警告,告诉您distcc安装程序已损坏,但它是在本地编译的。
该命令不“转换为PIC”,它编译文件serialib.c
并生成编译的对象文件serialib.o
g++ serialib.cpp -L /home/debian/serialib.h
这简直是胡说八道。它试图从serialib.cpp
构建一个程序,并使用目录/home/debian/serialib.h
(它不是一个目录!)找到图书馆。
不需要“编译库”,只需编译两个源文件并将它们链接到一个程序中即可。或者:
g++ -c serialib.cpp
g++ -c uart.cpp
g++ serialib.o uart.o -o uart
或者一个命令:
g++ serialib.cpp uart.cpp -o uart
您应该阅读An Introduction to GCC来理解这些命令,而不仅仅是在不理解命令的情况下输入假的命令。