G++ какие опции компилятора выбрать?

Тема в разделе "Raspberry Pi", создана пользователем Un_ka, 15 фев 2020.

  1. Un_ka

    Un_ka Гуру

    Я написал код на c++ для raspberry pi , в котором задействованы библиотеки sfml и rf24.
    Если для компиляции кода под rf24 нужны такие опции
    Код (Bash):
     
    g++ -Ofast -Wall RF24_scanner.cpp -lrf24 -o RF24_scanner
    Основными из которых являются -Ofast (описание данной опции я не нашёл ни в интернете ни в справке)
    и -lrf24 подключение библиотеки.
    А для sfml компиляция и трансляция проходит в два этапа:
    Код (Bash):
    g++ -c main.cpp
    g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system
     
    В связи с этим вопрос : Как компилировать и собирать получившийся код?
    Код (C++):
         

    /*
    cd /home/ftp_user/cpp/graf
    sudo g++ -c graf4.cpp
    sudo g++ graf4.o -o graf4e -lsfml-graphics -lsfml-window -lsfml-system

    */

    //#include <unistd.h>
    #include <SFML/Graphics.hpp>
    #include <SFML/System.hpp>
    #include <vector>
    #include <iostream>
    #include <cstdlib>


    #include <RF24/nRF24L01.h>
    /*
    * Подключаем библиотеку для работы с nRF24L01+
    */

    #include <RF24/RF24.h>

    using namespace std;

    /*
    * Конфигурация оборудования
    */

    #define BCM_PIN 25
    #define SPI_DEV 0
    #define NUM_CHANNELS 126



    const int per0=20; //50 герц
    sf::Clock gen; // starts the clock

    uint8_t values[NUM_CHANNELS];
    const int numReps = 100;
    //------------функции-----------
    int milliss()
    {
    float t=gen.getElapsedTime().asMilliseconds();
    //float t=gen.getElapsedTime().asMicroseconds();
    return (int)abs(t);
    }
    int last0,vrem;
    int main() {
    sf::RenderWindow window(sf::VideoMode(1020, 400), "SFML works!");// x,y
      sf::CircleShape shape(100.f);
       shape.setFillColor(sf::Color::Green);
      // sf::Clock clock;
        /*
       * Создаём объект radio для работы с библиотекой RF24,
       * указывая номера вывода CE и SPI порта
       */

      RF24 radio(BCM_PIN, SPI_DEV);

      /*
       * Инициируем работу nRF24L01+
       */

      radio.begin();

      radio.setAutoAck(false);

      /*
       * Вход в режиме ожидания
       */

      radio.startListening();
      radio.stopListening();


       last0=milliss();
         while (window.isOpen()) {
         sf::Event event;
     
       // if(milliss()-last0>per0){
         while (window.pollEvent(event)) {
          if (event.type == sf::Event::Closed) window.close();
          }
       
    vector<sf::RectangleShape> ppd{126};

    //  memset(values, 0, sizeof(values));

    for (int k = 0; k < numReps; ++k) {
          for (int i = 0; i < NUM_CHANNELS; ++i) {

            /*
             * Выбор канала
             */

            radio.setChannel(i);

            /*
             * Послушать немного
             */

            radio.startListening();
            delayMicroseconds(100);
            radio.stopListening();

            /*
             * Проверка наличия несущей частоты на выбранном канале (частоте).
             */

            if (radio.testCarrier()) {
              ++values[i];
            }
          }
        }


          for(int n=0;n<126;n++){
    ppd[n].setSize( sf::Vector2f(7,1+values[n]));
    ppd[n].setPosition(1+(8*n),170);
       }
    //  ppd.setPosition(50+(100*n),0);
     
        // Отрисовка окна
    window.clear(sf::Color::Black);
       for(int n =0;n<126;n++){window.draw(ppd[n]);}
    // window.draw(ppd[2]);
    window.display();
     
        // last0=milliss();

    //    }
        }
        return 0;
    }
             
    Я пробовал разные варианты, так если подключать rf24 на втором этапе то компилятор будет ругаться на первом этапе, если подключать на первом этапе и на втором , то вроде не ругается, но программа запускается и сразу же закрывается. В один этап собрать вообще ни как. Слышал, что можно прописать все опции в фаиле make...
    P.S.
    Программа должна была выводить уровень сигнала на каналах в виде столбцов.
    Вот так выглядит:
    Screenshot_2020-02-15-14-43-13-498_com.realvnc.viewer.android.jpg
    Если что это рандомная генерация.
     
    Последнее редактирование: 15 фев 2020
  2. Asper Daffy

    Asper Daffy Иксперд

  3. Un_ka

    Un_ka Гуру

    Спасибо, эту опцию точно нужно вычеркнуть.
     
  4. Un_ka

    Un_ka Гуру

    Я эту опцию сразу выпилил.
    Код (Bash):
    g++  -c  -Wall ${file} -lrf24
    g++ ${name}.o -o ${name} -lsfml-graphics -lsfml-window -lsfml-system  -lrf24  
    С такими опциями компилируется, но ошибается вроде как на этапе инициализации nrf.
     
  5. Un_ka

    Un_ka Гуру

    Пока решаю данную проблему следующим образом : есть две программы одна записывает данные в файл ,другая читает и выводит на экран.
     
  6. AlexU

    AlexU Гуру

    Не совсем понятна Ваша проблема. Но, если нужно собрать программу из разных исходников, то сначала компилируются исходники (обязательно должна присутствовать опция '-c'), а потом всё линкуется в один файл.
    Должно быть примерно так (я не в курсе особенностей Вашего проекта, поэтому пример скорее будет не рабочим):
    Код (Bash):

    # Компилируем RF24_scanner.cpp, получаем RF24_scanner.o
    g++ -c -Ofast -Wall RF24_scanner.cpp -o RF24_scanner.o
    # Компилируем main.cpp, получаем main.o
    g++ -c main.cpp -o main.o
    # Линкуем всё в одну программу sfml-app
    g++ RF24_scanner.o main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system -lrf24
     
     
    Un_ka нравится это.