Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Linux上编译外部库_C++_Linux_Compilation_G++ - Fatal编程技术网

C++ 在Linux上编译外部库

C++ 在Linux上编译外部库,c++,linux,compilation,g++,C++,Linux,Compilation,G++,大家好, 注意-这个问题已经解决了-我在回答部分提供了我自己的解决方案,但是Jonathan提供的解决方案要短得多。然而,这是我最初发布的以下问题: 我基本上是在尝试在Linux上编译一个串行库(用于UART通信),但是我不确定如何正确编译(我在下面提到了我到目前为止所做的),任何建议都是非常有价值的。我正在使用serialib库-它由两个主文件(serialib.h和serialib.cpp)组成,您可以在此处直接查看这些文件的源代码(一直滚动到底部,并在新选项卡中查看文件): 我将这些文件(

大家好,

注意-这个问题已经解决了-我在回答部分提供了我自己的解决方案,但是Jonathan提供的解决方案要短得多。然而,这是我最初发布的以下问题:

我基本上是在尝试在Linux上编译一个串行库(用于UART通信),但是我不确定如何正确编译(我在下面提到了我到目前为止所做的),任何建议都是非常有价值的。我正在使用serialib库-它由两个主文件(serialib.hserialib.cpp)组成,您可以在此处直接查看这些文件的源代码(一直滚动到底部,并在新选项卡中查看文件):

我将这些文件(serialib.h和serialib.cpp)传输到运行Debian(Wheezy)、g++/gcc(Debian 4.6.3-14)4.6.3的BeagleBone Black微控制器。我编写了自己的程序(uart.cpp是我的文件名)来访问这个库提供的函数,我写的是:

#include <iostream>
#include "serialib.h"
#ifdef __linux__
#define DEVICE_PORT "/dev/ttyO1"
#endif
int main()
{
    serialib LS;
    return 0;
}
#包括
#包括“serialib.h”
#ifdef_uuuLinux__
#定义设备\端口“/dev/ttyO1”
#恩迪夫
int main()
{
串行总线;
返回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](dcc_build_某处)警告:分发失败,改为在本地运行

  • g++serialib.cpp-L/home/debian/serialib.h这会产生以下错误:
  • /usr/lib/gcc/arm-linux-gnueabihf/4.6/./../../../../arm-linux-gnueabihf/crt1.o:在函数
    \u start'中:
    (.text+0x30):未定义对
    main'的引用 collect2:ld返回了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
    
    您应该阅读以理解命令,而不是只输入虚假命令而不理解它们

  • 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
    

    您应该阅读以理解命令,而不仅仅是在不理解命令的情况下输入虚假命令。

    我已经找到了解决此问题的方法,希望这对所有将来遇到类似问题的读者有所帮助。我有我自己的源代码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测试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测试您的_代码.cpp-labc

    test
    是自己的程序,lserialib实际上是在寻找libserialib.so而不是serialib.o,因为gcc/g++假设所有库都以
    lib
    开头,以.so或.a结尾,你可以看到labc和libabc的情况一样。因此,确保库名以
    lib