c++ - “SerialStream”没有命名类型

标签 c++ compiler-errors libserial

我使用的是 Ubuntu 14.04。 我想将 libSerial 用于描述 here 的项目. 我使用 sudo apt-get install libserial-dev 安装了库。

我写了一个小程序(好吧,它不是真正的程序):

#include "SerialStream.h"
#include <iostream>

#define PORT "/dev/ttyUSB0"

SerialStream ardu;

using namespace std;
using namespace LibSerial;

但是编译器说:'SerialStream' does not name a type

有什么帮助吗?

编辑: 在命名空间行之后放置 SerialStream ardu 之后,问题就更加奇怪了:

g++ main.cpp -o ArduCom
/tmp/ccNzzINg.o: In Funktion `main':
main.cpp:(.text+0x7a): not defined reference to `LibSerial::SerialStream::Open(std::string, std::_Ios_Openmode)'
main.cpp:(.text+0x12d): not defined reference to `LibSerial::SerialStream::SetBaudRate(LibSerial::SerialStreamBuf::BaudRateEnum)'
main.cpp:(.text+0x181): not defined reference to `LibSerial::SerialStream::SetCharSize(LibSerial::SerialStreamBuf::CharSizeEnum)'
main.cpp:(.text+0x1d5): not defined reference to `LibSerial::SerialStream::SetParity(LibSerial::SerialStreamBuf::ParityEnum)'
main.cpp:(.text+0x229): not defined reference to `LibSerial::SerialStream::SetNumOfStopBits(short)'
main.cpp:(.text+0x27d): not defined reference to `LibSerial::SerialStream::SetFlowControl(LibSerial::SerialStreamBuf::FlowControlEnum)'
/tmp/ccNzzINg.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[_ZTVN9LibSerial15SerialStreamBufE]+0x48): not defined reference to `LibSerial::SerialStreamBuf::showmanyc()'
/tmp/ccNzzINg.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[_ZTVN9LibSerial15SerialStreamBufE]+0x50): not defined reference to `LibSerial::SerialStreamBuf::xsgetn(char*, long)'
/tmp/ccNzzINg.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[_ZTVN9LibSerial15SerialStreamBufE]+0x58): not defined reference to `LibSerial::SerialStreamBuf::underflow()'
/tmp/ccNzzINg.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[_ZTVN9LibSerial15SerialStreamBufE]+0x68): not defined reference to `LibSerial::SerialStreamBuf::pbackfail(int)'
/tmp/ccNzzINg.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[_ZTVN9LibSerial15SerialStreamBufE]+0x70): not defined reference to `LibSerial::SerialStreamBuf::xsputn(char const*, long)'
/tmp/ccNzzINg.o:(.rodata._ZTVN9LibSerial15SerialStreamBufE[_ZTVN9LibSerial15SerialStreamBufE]+0x78): not defined reference to `LibSerial::SerialStreamBuf::overflow(int)'

最佳答案

首先,您从命名空间 LibSerial 中定义了一个类型为 SerialStream 的对象,但没有对其进行适当的限定:

#include "SerialStream.h"
#include <iostream>

#define PORT "/dev/ttyUSB0"

SerialStream ardu; // error this type is unqualified

using namespace std;
using namespace LibSerial;

有很多方法可以限定类型。一种是将定义放在 命名空间using 声明 之后,类型定义在:

#include "SerialStream.h"
#include <iostream>

#define PORT "/dev/ttyUSB0"

using namespace std;
using namespace LibSerial;

// qualified by the compiler searching through the
// declared namespaces and finding it in `namespace LibSerial`.

SerialStream ardu; 

另一种方法是限定类型名明确属于特定命名空间:

LibSerial::SerialStream ardu; // fully qualifies name

这样做之后,您的第二个问题是编译器需要知道 libserial 库在文件系统 中的位置,以便能够链接到它.

假设您将库安装到默认位置,那么这可能就足够了:

g++ main.cpp -o ArduCom -lserial

否则,您可能必须使用 -L 开关指定库所在的位置:

g++ main.cpp -o ArduCom -Wl,-rpath,/path/to/library/folder -L/path/to/library/folder -lserial

libserial 库是使用 Autotools 构建的因此,如果您从源代码构建并安装它,它会在安装过程中提供链接说明。

指令有点像这样:

----------------------------------------------------------------------
Libraries have been installed in:
   /path/to/libserial/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
   - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

关于c++ - “SerialStream”没有命名类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32038382/

相关文章:

c++ - 总是读取超时

c++ - wxStyledTextCtrl (Scintilla) 中的缩进和智能缩进

android - 播放新歌曲时收到IllegalStateException

c++ - 如果在 linux Ubuntu :)10. 10 中包含 boost/thread,则不会编译

java - 找不到符号 "OnKeyListener"

C++ 将字节写入串行流

c++ - 如何在编译时打印常量值?

c++ - 代码块的 Boost 库设置

c++ - 在线判断平台中的全局数组堆内存分配