как скомпилировать blacklib (c++)

Я запускаю бигльбон и хочу написать программу для выборки АЦП. Я пытаюсь использовать blacklib (http://blacklib.yigityuce.com/index.html ) отсюда. Я клонировал git: https://github.com/yigityuce/BlackLib

и попытался скомпилировать пример с

g++ exampleAndTiming.cpp -std=c++11

Однако это дает мне массу ошибок, подобных этим:

In file included from exampleAndTiming.cpp:33:0:
exampleAndTiming/exampleAndTiming_GPIO.h: In function 'void exampleAndTiming_GPIO()':
exampleAndTiming/exampleAndTiming_GPIO.h:97:12: error: 'sleep' was not declared in this scope
     sleep(1);
            ^
In file included from exampleAndTiming.cpp:34:0:
exampleAndTiming/exampleAndTiming_ADC.h: In function 'void exampleAndTiming_ADC()':
exampleAndTiming/exampleAndTiming_ADC.h:67:16: error: 'usleep' was not declared in this scope
     usleep(1000);
                ^

поэтому я включаю unistd.h (в exampleAndTiming.cpp), но потом получаю такие ошибки:

/tmp/ccbgiXE9.o: In function `exampleAndTiming_GPIO()':
exampleAndTiming.cpp:(.text+0x50): undefined reference to `Timing::startMeasure(std::string)'
exampleAndTiming.cpp:(.text+0x80): undefined reference to `BlackLib::BlackGPIO::BlackGPIO(BlackLib::gpioName, BlackLib::direction, BlackLib::workingMode)'
exampleAndTiming.cpp:(.text+0xbc): undefined reference to `Timing::endMeasure(std::string)'
exampleAndTiming.cpp:(.text+0xec): undefined reference to `BlackLib::BlackGPIO::BlackGPIO(BlackLib::gpioName, BlackLib::direction, BlackLib::workingMode)'
exampleAndTiming.cpp:(.text+0x104): undefined reference to `BlackLib::BlackGPIO::BlackGPIO(BlackLib::gpioName, BlackLib::direction, BlackLib::workingMode)'
exampleAndTiming.cpp:(.text+0x11c): undefined reference to `BlackLib::BlackGPIO::BlackGPIO(BlackLib::gpioName, BlackLib::direction, BlackLib::workingMode)'
exampleAndTiming.cpp:(.text+0x158): undefined reference to `Timing::startMeasure(std::string)'

Я просматривал некоторые примеры библиотек и компилировал их, но я не могу во всем этом разобраться. Раньше я скомпилировал множество программ на С++ и С, но не могу заставить эту работать. Так что любая помощь будет оценена.


person tomzooi    schedule 04.01.2015    source источник


Ответы (3)


ПОЛНОЕ РУКОВОДСТВО, как скомпилировать BLACKLIB непосредственно на BEAGLEBONE BLACK (rev C) под управлением ANGSTROM:

Программы:

Putty — для связи с BBB из Windows (используя SSH с кабелем USB)

WinSCP — для управления (загрузки, создания, удаления) файлами непосредственно на BBB

Code::Blocks — для написания программ на C++.

необязательно

Termite 2.9 - для отправки и получения передачи UART от преобразователя UART‹->USB (на самом деле для этого также можно использовать Putty)

1) получить BlackLib с официального сайта

2) разархивируйте библиотеку и скопируйте следующие файлы в отдельную папку:

BlackADC.cpp, BlackADC.h, BlackCore.cpp, BlackCore.h, BlackDef.h, BlackErr.h, BlackGPIO.cpp, BlackGPIO.h, BlackI2C.cpp, BlackI2C.h, BlackLib.h, BlackPWM.cpp, BlackPWM.h, BlackSPI.cpp, BlackSPI.h, BlackUART.cpp, BlackUART.h

3) откройте следующие файлы в Code::Blocks BlackUART.cpp, BlackSPI.cpp, BlackI2C.cpp и добавьте

#include <unistd.h>

сразу после #include "BlackUART.h" "unistd.h" включает в себя все функции, такие как sleep(), open(), close(), ..., которые иначе кажутся отсутствующими

4) создайте свою собственную программу main.cpp, вы можете использовать следующий код для тестирования UART1 и UART2:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <sstream>
#include <string>
#include <iostream>


#include "BlackLib.h"


int main(){

    std::string writeToUart1;
    std::string writeToUart2;
    std::string readFromUart1;
    std::string readFromUart2;
    int counter;
    std::ostringstream os1;
    std::ostringstream os2;

    BlackLib::BlackUART  Uart1(BlackLib::UART1,
                               BlackLib::Baud9600,
                               BlackLib::ParityEven,
                               BlackLib::StopOne,
                               BlackLib::Char8 );
    // Pins on BeagleBone Black REV C
    // UART1_RX -> GPIO_15 (P9.24)
    // UART1_RX -> GPIO_14 (P9.26)

    BlackLib::BlackUART  Uart2(BlackLib::UART2,
                               BlackLib::Baud9600,
                               BlackLib::ParityEven,
                               BlackLib::StopOne,
                               BlackLib::Char8 );
    // Pins on BeagleBone Black REV C
    // UART2_RX -> GPIO_2 (P9.22)
    // UART2_RX -> GPIO_3 (P9.21)

    std::cout << "Program UART start" << std::endl << std::flush;

    Uart1.open( BlackLib::ReadWrite | BlackLib::NonBlock );
    Uart2.open( BlackLib::ReadWrite | BlackLib::NonBlock );

    counter = 0;

    while (true){

        os1.str("");
        os1.clear();
        os1 << "Uart1 to TX: " << counter << "\n";
        writeToUart1 = os1.str();
        Uart1 << writeToUart1;

        readFromUart1 = "";
        Uart1 >> readFromUart1;
        if (readFromUart1.compare("") != 0){
                std::cout << "Uart1 from RX: " << readFromUart1 << "\n" << std::flush;
        }
        Uart1.flush( BlackLib::bothDirection );
        counter++;
        sleep(2);


        os2.str("");
        os2.clear();
        os2 << "Uart2 to TX: " << counter << "\n";
        writeToUart2 = os2.str();
        Uart2 << writeToUart2;

        readFromUart2 = "";
        Uart2 >> readFromUart2;
        if (readFromUart2.compare("") != 0){
                std::cout << "Uart2 from RX: " << readFromUart2 << "\n" << std::flush;
        }
        Uart2.flush( BlackLib::bothDirection );
        counter++;
        sleep(2);


    }

    return 1;
}

5) сохраните файл main.cpp в той же папке, что и файлы BlackLib.

6) с помощью WinSCP создайте каталог на BBB (например, /home/uart) и скопируйте все файлы BlackLib и main.cpp в эту папку.

7) откройте Putty и перейдите к папке: cd /home/uart

8) скомпилируйте файлы, используя: gcc *.cpp -o main -std=c++11

9) запустите программу: ./main

10) подключите провода к конвертеру UART‹->USB и BBB. Вывод из BBB должен выглядеть так:

Uart2 to TX: 1   OR   Uart1 to TX: 0
Uart2 to TX: 3   OR   Uart1 to TX: 2

в зависимости от соединения проводов

person Martin G    schedule 16.04.2015

Кажется, мне удалось исправить это самостоятельно, какое-то нубское поведение, не включая все файлы cpp, но даже больше, мне также нужно было добавить #include в BlackCore.h, чтобы избежать множества ошибок неопределенных функций.

финальная команда:

g++ exampleAndTiming.cpp exampleAndTiming/Timing.cpp BlackADC.cpp BlackCore.cpp BlackGPIO.cpp BlackI2C.cpp BlackPWM.cpp BlackSPI.cpp BlackUART.cpp -std=c++11

Мне, вероятно, нужно было бы сделать make-файл для компиляции библиотеки отдельно, время, чтобы еще немного покопаться и изучить.

person tomzooi    schedule 05.01.2015

Я создатель BlackLib, Йигит ЮСЕ. Вы сами нашли ответ. Makefile, который вы упомянули в своем комментарии, будет опубликован в ближайшее время.

person yigityuce    schedule 18.01.2015
comment
Это было бы полезным дополнением, вместе с примером проекта, вероятно, было бы лучше. Однако я вернулся к libpruio, потому что blacklib не использует PRU и по какой-то причине даже медленнее получает значения ADC, чем просто считывает связанные файлы из файловой системы (130 операций чтения в секунду против 80 операций чтения всех каналов ADC). - person tomzooi; 18.01.2015