首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >'SerialStream‘没有命名类型

'SerialStream‘没有命名类型
EN

Stack Overflow用户
提问于 2015-08-16 18:14:53
回答 1查看 2.1K关注 0票数 0

我用的是Ubuntu 14.04。我想将libSerial用于像描述的这里那样的项目。我使用sudo apt-get install libserial-dev安装了这个库。

我写了一个小程序(嗯,其实不是一个程序):

代码语言:javascript
复制
#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放在命名空间行之后,问题就更奇怪了:

代码语言:javascript
复制
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)'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-17 14:46:00

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

代码语言:javascript
复制
#include "SerialStream.h"
#include <iostream>

#define PORT "/dev/ttyUSB0"

SerialStream ardu; // error this type is unqualified

using namespace std;
using namespace LibSerial;

有许多方法来限定类型。一种方法是将定义放在命名空间的使用声明之后,类型在以下文件中定义:

代码语言:javascript
复制
#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; 

另一种方法是将typename显式地限定为属于特定的命名空间:

代码语言:javascript
复制
LibSerial::SerialStream ardu; // fully qualifies name

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

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

代码语言:javascript
复制
g++ main.cpp -o ArduCom -lserial

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

代码语言:javascript
复制
g++ main.cpp -o ArduCom -Wl,-rpath,/path/to/library/folder -L/path/to/library/folder -lserial

libserial库是使用自动工具构建的,因此,如果您从源代码构建和安装它,它将提供链接说明作为安装过程的一部分。

这些说明有点像这样:

代码语言:javascript
复制
----------------------------------------------------------------------
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.
----------------------------------------------------------------------
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32038382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档