неопределенная ссылка на LibSerial - PullRequest
3 голосов
/ 16 февраля 2010

Итак, я пишу программу для последовательной передачи, и только что перешел на использование 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

Ответы [ 4 ]

6 голосов
/ 16 февраля 2010

Это явно компоновщик, жалующийся на то, что я не могу найти ссылку на функцию в заголовочном файле 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 голосов
/ 16 февраля 2010

Включение заголовочного файла недостаточно - вам также нужно связаться с библиотекой, которая реализует SerialStream. Предполагая, что это статическая библиотека с именем serstream.a (почти наверняка она называется что-то еще):

g++ -Wall -o gen1 gen1.cpp string2num.o serstream.a
1 голос
/ 29 июня 2018

старый поток, но я все еще использую 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 использует мьютекс.

0 голосов
/ 04 июля 2012

В Ubuntu / Debian убедитесь, что у вас установлен пакет libserial-dev, и используйте флаг '-lserial' для gcc.

...