2010-02-16 19 views
3

所以我正在編寫一個串行傳輸程序,並且剛剛改爲使用C++,因爲我使用了C++ (我最近一直在使用C語言,並且在此之前使用了Java)undefined referance to LibSerial

現在我需要使用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 

回答

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 
2

包含頭文件是不夠的 - 您還需要鏈接到實現SerialStream的庫。假設它是一個靜態庫調用serstream.a(它幾乎可以肯定是實際上是調用別的東西):

g++ -Wall -o gen1 gen1.cpp string2num.o serstream.a 
0

在Ubuntu/Debian中,確保你必須安裝libserial-dev軟件包並使用'-lserial'標誌作爲gcc。

相關問題