4

所以我正在编写一个串行传输程序,并且刚刚改用 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

4 回答 4

6

这是链接器抱怨它找不到 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
于 2010-02-16T10:57:54.993 回答
2

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

g++ -Wall -o gen1 gen1.cpp string2num.o serstream.a
于 2010-02-16T10:46:26.790 回答
1

旧线程,但我仍然使用 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)你的代码。

我必须更改一些代码,首先我删除自定义标头并修改对它的构造函数调用。

SerialStream theSerialStream;

4) 用 g++ 编译

这是我的编译命令

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

检查 -lpthread 链接选项,因为 Libserial 使用互斥锁。

于 2018-06-29T17:44:29.493 回答
0

在 Ubuntu/Debian 中,确保您必须安装 libserial-dev 软件包并为 gcc 使用“-lserial”标志。

于 2012-07-04T05:08:51.707 回答