2015-08-16 43 views
0

我使用的是Ubuntu 14.04。 我想使用libSerial进行项目描述here。 我使用sudo apt-get install libserial-dev安装了库。'SerialStream'没有指定类型

我写了一个小程序(当然,这不是一个真正的程序):

#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)' 
+2

你尝试把'SerialStream ardu;''在使用命名空间后LibSerial;'声明? –

+0

@Galik; sry,错字,不会改变问题... – PEAR

+1

@PEAR你的编辑没有使任何更清晰的?试试我告诉你要做的,或者写'LibSeria :: SerialStream ardu;'。 –

回答

1

首先,你已经从命名空间LibSerial没有正确预选赛定义SerialStream类型的对象它:

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

#define PORT "/dev/ttyUSB0" 

SerialStream ardu; // error this type is unqualified 

using namespace std; 
using namespace LibSerial; 

有许多的方式来资格型。一个是通过将定义使用命名空间的声明后的类型是在限定的:

#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. 
----------------------------------------------------------------------