在Linux上编译外部库

时间:2017-02-08 14:28:04

标签: c++ linux compilation g++

每个人的好日子,

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库,因为我没有看到它在原始源代码中声明。

现在我真的不确定如何编译这样的外部库,但到目前为止我尝试了以下步骤:

  1. g ++ -c -Wall -Werror -fPIC serialib.c 转换为PIC会产生以下错误:
  2. distcc [3142](dcc_parse_hosts)警告:/home/debian/.distcc/zeroconf/hosts不包含主机;不能分发工作 distcc [3142](dcc_zeroconf_add_hosts)重要!无法解析主机文件。 distcc [3142](dcc_build_somewhere)警告:无法分发,而是在本地运行

    1. g ++ serialib.cpp -L /home/debian/serialib.h ,它出现以下错误:
    2. /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失败

      到目前为止,我仍然在寻找如何编译它,如果我设法解决这个问题,那么我也会在这里发布我的解决方案。再一次任何建议都将非常有价值。谢谢大家:)。

2 个答案:

答案 0 :(得分:2)

  
      
  1. g++ -c -Wall -Werror -fPIC serialib.c转换为PIC会产生以下错误:
  2.   

&#34;错误&#34;这不是一个错误,它是一个警告,告诉你你的distcc设置被破坏了,但它是在本地编译的。

该命令没有&#34;转换为PIC&#34;,它编译文件serialib.c并生成编译的目标文件serialib.o

  
      
  1. g++ serialib.cpp -L /home/debian/serialib.h
  2.   

这只是胡说八道。它尝试从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}}。感谢所有花时间阅读这个问题的人,尤其是那些给我建议的人。如果有人有更多或更好的解决方案,请随时在这里发布,以帮助未来的读者:)。