所以我正在编写一个串行传输程序,并且刚刚转到使用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
答案 0 :(得分: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
答案 1 :(得分:2)
包含头文件是不够的 - 您还需要链接实现SerialStream的库。假设它是一个名为serstream.a的静态库(实际上它实际上被称为其他东西):
g++ -Wall -o gen1 gen1.cpp string2num.o serstream.a
答案 2 :(得分: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使用互斥锁。
答案 3 :(得分:0)
在Ubuntu / Debian中确保你必须安装libserial-dev包并使用gcc的'-lserial'标志。