代码之家  ›  专栏  ›  技术社区  ›  Frames Catherine White

未定义对libserial的引用

  •  3
  • Frames Catherine White  · 技术社区  · 14 年前

    所以我写了一个串行传输程序,刚改成用C++,我用C++已经有一段时间了。 (我最近一直和C一起工作,在Java之前)

    现在我需要使用libserial, (这似乎比C的termios简单得多)

    我的代码是:

    //gen1.cpp
    #include "string2num.h" // a custom header
    #include <iostream>
    #include <SerialStream.h>
    using namespace LibSerial;
    //using namespace std;
    
    int main(int argc, char*argv[])
    {
            if (argc<2)
            {
                    std::cout<<argv[0]<<"requires the device name eg \"dev/tty0\" as a parameter\nterminating.\n";
                    return 1;
            }    
            SerialStream theSerialStream(argv[1]); //open the device
            return 0;
    }
    

    当我编译输出时:

    g++ -Wall -o gen1 gen1.cpp string2num.o
    /tmp/cchPBWgx.o: In function `main':
    gen1.cpp:(.text+0x121): undefined reference to `LibSerial::SerialStream::SerialStream(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::_Ios_Openmode)'
    /tmp/cchPBWgx.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[vtable for LibSerial::SerialStreamBuf]+0x24): undefined reference to `LibSerial::SerialStreamBuf::showmanyc()'
    /tmp/cchPBWgx.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[vtable for LibSerial::SerialStreamBuf]+0x28): undefined reference to `LibSerial::SerialStreamBuf::xsgetn(char*, int)'
    /tmp/cchPBWgx.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[vtable for LibSerial::SerialStreamBuf]+0x2c): undefined reference to `LibSerial::SerialStreamBuf::underflow()'
    /tmp/cchPBWgx.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[vtable for LibSerial::SerialStreamBuf]+0x34): undefined reference to `LibSerial::SerialStreamBuf::pbackfail(int)'
    /tmp/cchPBWgx.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[vtable for LibSerial::SerialStreamBuf]+0x38): undefined reference to `LibSerial::SerialStreamBuf::xsputn(char const*, int)'
    /tmp/cchPBWgx.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[vtable for LibSerial::SerialStreamBuf]+0x3c): undefined reference to `LibSerial::SerialStreamBuf::overflow(int)'
    collect2: ld returned 1 exit status
    make: *** [gen1] Error 1
    
    4 回复  |  直到 6 年前
        1
  •  6
  •   amo-ej1    14 年前

    很明显,链接器抱怨我找不到libserial头文件引用的函数。因此,如果我查看我的Linux系统如何调用共享库:

    $ dpkg -L libserial0
    ...
    /usr/lib/libserial.so.0.0.0
    /usr/lib/libserial.so.0
    

    在我的系统中,这意味着我将添加-lserial作为g++选项(也就是libserial.so的链接),这将把编译命令转换为

    g++ -Wall -lserial -o gen1 gen1.cpp string2num.o
    
        2
  •  2
  •   anon    14 年前

    包含头文件是不够的-您还需要与实现serialstream的库链接。假设它是一个名为serstream.a的静态库(几乎可以肯定它实际上被称为其他库):

    g++ -Wall -o gen1 gen1.cpp string2num.o serstream.a
    
        3
  •  1
  •   Holister    6 年前

    旧线程,但我仍然使用libserial。这里是完整的答案 我的工作设置。

    Ubuntu 18.04 G++7.3.0

    1)安装libserial软件包

    apt install libserial-dev
    

    2)检查头文件(.h)和.so文件

    dpkg -l libserial0
    dpkg -l libserial-dev
    

    第一个命令给出共享库的目录,第二个命令给出头的位置。

    3)你的代码。

    我必须稍微修改一下您的代码,首先删除自定义头并修改对它的constructor调用。

    SerialStream theSerialStream;
    

    4)用g编译++

    这里是我的编译命令

    g++ -o test -I/usr/include test.cpp -L/usr/lib/x86_64-linux-gnu -lserial -lpthread
    

    检查-lpthread链接选项,因为libserial使用mutex。

        4
  •  0
  •   maxywb    12 年前

    在ubuntu/debian中,确保必须安装libserial dev包,并为gcc使用“-lserial”标志。