每个人的好日子,
N.B - 这个问题已经解决了 - 我在答案部分提供了自己的解决方案,但Jonathan提供的解决方案要短得多。然而,这是我最初发布的以下问题:
我基本上是想在Linux上编译一个串行库(用于UART通信)但是我不确定如何正确编译(我已经提到了我到目前为止所做的事情),任何建议都非常有价值。我正在使用serialib库 - 它由2个主要文件( serialib.h 和 serialib.cpp )组成,您可以在这里直接查看这些文件的源代码(一直滚动到底部并在新标签中查看文件):this article
我将这些文件(serialib.h和serialib.cpp)传输到运行Debian(Wheezy)的BeagleBone Black微控制器,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库,因为我没有看到它在原始源代码中声明。
现在我真的不确定如何编译这样的外部库,但到目前为止我尝试了以下步骤:
distcc [3142](dcc_parse_hosts)警告:/home/debian/.distcc/zeroconf/hosts不包含主机;不能分发工作 distcc [3142](dcc_zeroconf_add_hosts)重要!无法解析主机文件。 distcc [3142](dcc_build_somewhere)警告:无法分发,而是在本地运行
/usr/lib/gcc/arm-linux-gnueabihf/4.6 /../../../ arm-linux-gnueabihf / crt1.o:在函数_start':
(.text+0x30): undefined reference to
main'中
collect2:ld返回1退出状态
distcc [3210]错误:在localhost上编译serialib.cpp失败
到目前为止,我仍然在寻找如何编译它,如果我设法解决这个问题,那么我也会在这里发布我的解决方案。再一次任何建议都将非常有价值。谢谢大家:)。
答案 0 :(得分:2)
- 醇>
g++ -c -Wall -Werror -fPIC serialib.c
转换为PIC会产生以下错误:
&#34;错误&#34;这不是一个错误,它是一个警告,告诉你你的distcc设置被破坏了,但它是在本地编译的。
该命令没有&#34;转换为PIC&#34;,它编译文件serialib.c
并生成编译的目标文件serialib.o
- 醇>
g++ serialib.cpp -L /home/debian/serialib.h
这只是胡说八道。它尝试从serialib.cpp
构建一个程序,并使用目录/home/debian/serialib.h
(不是目录!)来查找库。
您不需要&#34;编译图书馆&#34;你可以编译两个源文件并将它们链接到一个程序中。之一:
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以了解这些命令,而不仅仅是在不理解命令的情况下输入伪造的命令。
答案 1 :(得分:0)
我找到了解决这个问题的方法,希望这有助于所有未来有类似问题的读者。我有自己想要编译的源代码uart.cpp(在问题中给出),外部库是 serialib ,它包含两个主要文件(serialib.h和serialib.cpp),您将需要替换以下有关您拥有的文件的命令
第1步:使用与位置无关的代码进行编译
g ++ -c -Wall -Werror -fpic serialib.cpp
第2步:创建共享库
g ++ -shared -o libserialib.so serialib.o ,这里的库是 libserialib.so 。
第3步:将源代码与库链接
g ++ -L / home / debian -lserialib uart.cpp -o uart
g ++ -L / home / debian -Wall -o test uart.cpp -lserialib
您可以将库保存在其他路径中,当然您可能有不同的名称。假设您在目录/ home / user / myDir中有一个名为libabc.so的库,那么命令就像:
g ++ -L / home / user / myDir -labc your_code.cpp -o your_code
g ++ -L / home / user / myDir -Wall -o test your_code.cpp -labc
test
是自己的程序,lserialib实际上是在寻找libserialib.so而不是serialib.o,因为gcc / g ++假定所有库都以lib
开头并以.so或.a结尾可以看到同样适用于labc,因为它会查找libabc.so因此,确保您的库名称以lib
开头并以.so或.a
第4步:在运行时使库可用
这里我们提供了实际存储库的路径,我把它保存在目录/ home / debian中,这就是我的命令看起来的原因:
export LD_LIBRARY_PATH = / home / debian:$ LD_LIBRARY_PATH
如果您的库保存在/ path / to / file,那么命令将如下所示:
export LD_LIBRARY_PATH = / path / to / file:$ LD_LIBRARY_PATH
这是为了帮助加载程序找到共享库并查看此路径: echo $ LD_LIBRARY_PATH 并取消设置:取消设置LD_LIBRARY_PATH
要执行程序类型./test或./uart,如果对主源代码进行任何修改(在本例中为uart.cpp),只需重复步骤3.我发现以下链接非常有用:{ {3}}。感谢所有花时间阅读这个问题的人,尤其是那些给我建议的人。如果有人有更多或更好的解决方案,请随时在这里发布,以帮助未来的读者:)。