LINUX.ORG.RU

317
Всего сообщений: 4168

Как скомпилировать 2 и более файлов .cpp в одну программу на linux?

Как скомпилировать 2 и более файлов .cpp в одну программу на linux? Понятно, через терминал (консоль) linux через gcc/g++…Но как добавить 2 и более файлов .cpp в другой «основной» файл .cpp? команда #include добавляет ведь, только библиотеки??

 , ,

wersto8top ()

libcurl - опция CURLOPT_WRITEFUNCTION

Позвольте спросить и тут несколько вопросов по опции licurl:

CURLOPT_WRITEFUNCTION, которая устанавливает обратный вызов функции при приемке новых данных и по нескольким дополнительным смежным опциям.

  1. Вопрос по CURLOPT_WRITEFUNCTION:—–>

В документации сказано:

Функция обратного вызова будет передавать как можно больше >данных >при всех вызовах, но вы не должны делать никаких >предположений. >Это может быть один байт, а может быть и тысячи. >Максимальный >объем данных тела, который будет передан функции >обратного вызова >записи, определен в файле заголовка curl.h : >CURL_MAX_WRITE_SIZE >(обычное значение по умолчанию - 16 КБ). >Если CURLOPT_HEADER >включен, что позволяет передавать данные >заголовка в обратный >вызов записи, вы можете получить до >CURL_MAX_HTTP_HEADER байтов >данных заголовка, переданных в >него. Обычно это означает 100К.

-Под 100К - имеется ввиду все тот же размер данных за один приход ? -Написано, что «Если CURLOPT_HEADER включен, то позволяет … 100К». Однако в документации к CURLOPT_HEADER сказано, что не опция CURLOPT_HEADER поддерживает 100K, а опция обратного вызова для заголовков CURLOPT_HEADERFUNCTION поддерживает 100K. Это небольшая неточность в документации ?

  1. Вопрос по CURLOPT_HEADER:—–>

Далее: обратный вызов CURLOPT_WRITEFUNCTION ограничен только >получением максимального количества переданных ему байтов >CURL_MAX_WRITE_SIZE (16 КБ), в то время как заголовок может быть >длиннее, а CURLOPT_HEADERFUNCTION поддерживает вызов с >заголовками до CURL_MAX_HTTP_HEADER bytes (100KBB).

-Подскажите, тут имеется ввиду, то, то заголовок может быть более 16K и его получение просто займет больше вызовов обратной функции CURLOPT_WRITEFUNCTION ? То есть грубо говоря ничего потеряно не будет, просто call-back будет вызываться чаще, так как принимает более маленькими порциями ?

  1. И еще один вопрос по опции CURLOPT_WRITEFUNCTION:

Эта функция может быть вызвана с нулевыми байтами данных, если >переданный файл пуст. Данные, передаваемые в эту функцию, не >будут завершаться нулевым символом в конце!

Не могу понять, что это может значит ? Зачем эта функция может быть вызвана с нулевым байтом данных и как на это реагировать ?

В чистых сокетах или портах завершения Windows, если функция WSARecv вызывалась с нулевыми данными - это значило, что соединение разварено со стороны севера. Тут то же самое или что то другое ? Главный вопрос, как на это нужно реагировать ?

 ,

Optimus1 ()

Как скопировать элементы из одного контейнера в другой

Добрый вечер, есть контейнеры с умными указателями, как их в другой контейнер перенести, желательно как-нибудь с предикатом навроде copy_if

#include <vector>
#include <memory>
using namespace std;

struct A {
    A(int val) : mVal(val) {

    }
    ~A() {

    }
    int val() const {
        return mVal;
    }
    private:
        int mVal;
};
int main(int argc, char *argv[])
{

    shared_ptr<A> a1 = make_unique<A> (3);
    shared_ptr<A> a2 = make_unique<A> (6);
    shared_ptr<A> a3 = make_unique<A> (9);
    vector<unique_ptr<A>> v1;
    vector<unique_ptr<A>> v2;
    v1.push_back( std::move(a1) );
    v1.push_back( std::move(a2) );
    v1.push_back( std::move(a3) );
}
Мне нужно в вектор v2 перенести элементы из v1 которые больше некоего значения.

 , , ,

da17 ()

libcurl - CURLOPT_WRITEFUNCTION - Странный параметр size

Здравствуйте,

Из документации Libcurl опции CURLOPT_WRITEFUNCTION:

size_t write_callback(char *ptr, size_t size, size_t nmemb, void >*userdata);

Эта функция обратного вызова вызывается libcurl, как только будут >получены данные, которые необходимо сохранить. Для большинства >передач этот обратный вызов вызывается много раз, и каждый вызов >доставляет еще один фрагмент данных. ptr указывает на >доставленные данные, размер которых равен nmemb ; размер всегда >равен 1.

А зачем этот параметр вообще нужен, если он всегда равен 1 ?

 ,

Optimus1 ()

std::reduce (и собратия) с ограничением на число тредов

Привет ЛОР.

Как ограничить максимальное число тредов, доступных для std::reduce с parallel_unsequenced_policy? Я просмотрел соответствующие страницы в cppreference, но не нашёл ответа. Я попробовал поиграться на уровене prlimit, но получил ошибку thread_monitor Resource temporarily unavailable in pthread_create. Хотелось бы не городить костылей в виде семафоров и мьютексов только ради такой казалось бы простой задачи.

UPD: В стандартной библиотеке так сделать нельзя, а вот в HPX можно. Вот пример: https://github.com/STEllAR-GROUP/hpx/blob/master/examples/quickstart/vector_zip_dotproduct.cpp

 , , ,

luke ()

Нужен козырный плюсовик

Добрый вечер, ЛОР!

На одноразовую задачу (либо на постоянную работу, в завимисоти от обоюдного желания) нужен царьмастер C++, который будет рад поработать со следущими технологиями:



Обещаю, что будет интересно.

Конкретную задачу разглашать не буду, однако скажу, что это связано с взаимодействием Telegram и внешним миром по VoIP.

Стоимость одноразовой задачи составляет 5000 USDT, однако, возможно постоянное трудоустройство и даже релокация (юрисдикция — IT столица Мира, Эстонская Республика), и всё зависит исключительно от Вас и от Вашего желания.



Контакты: электронная почта — noreply at sportloto.ee (4mod: это реальная электронная почта, могу пруфануть).


Спасибо за внимание.

 , , ,

annerleen ()

Подключение исходных файлов к проекту - на примере Libcurl

Здравствуйте,

Я уже понимаю, что так никто не делает, но мне все таки интересно сделать именно так.

Не собирать библиотеку в бинарный файл под конкретную IDE/компилятор, под конкретную ОС, с конкретными параметрами и зависимостями, а подключить к проекту именно исходные файлы библиотеки, ведь в них содержится вся реализация, правильно ??

Интересно то мне интересно, но не получается:

-Скачал исходники libcurl с их сайта: https://curl.se/download.html

-Создал свой проект в VS2019 и добавил туда все хедер файлы из папки libcurl/include.

-В проекте сделал include основного хедера и вызвал самою первую функцию инициализации libcurl:

#include <iostream>
#include "curl.h"
 
int main()
{
 
std:cout<<"Hello libcurl"<<std::endl;
 
 
    CURL* curl;
    CURLcode res;
 
    curl = curl_easy_init();
}

Естественно - этого не достаточно, а VS выдает ошибку «ссылка на неразрешённый внешний символ __imp__curl_easy_init в функции _main.»

То есть VS вроде, как определение curl_easy_init - нашел, а вот саму, как я понимаю реализацию этой функции нет ?

И если примерно все так, вот и вопрос, а где найти эту реализацию, в каких файлах ??? И как его добавить в проект VS2019 ?

Может кто нибудь может подсказать ?

PS: Libcurl - позиционируется, как opensource библиотека, теоретически файлы реализации должны быть открытыми ?

 , ,

Optimus1 ()

Масштабирование рисунков в Qt

Изучив несколько примеров, не нашел способа отмасштабировать нарисованное QPainter'ом под размеры виджета. Т.е. есть paintEvent

void myWidget::paintEvent(QPaintEvent *event)
{
    QPainter qp(this);

    qp.drawLine(beg_pos, 0, beg_pos, 40);
    qp.drawLine(beg_pos, 40, end_pos, 40);
    qp.drawLine(end_pos, 40, end_pos, 0);
}
в котором надо рисовать что-нибудь в собственной системе координат, а затем подогнать под рамки виджета, в котором и рисуем. Из документации понял, что для подобного есть матрицы, но как их правильно использовать?

 , , , ,

YetAnotherUser ()

'this' in lambda and in class method is not the same when using vector of std::thread

#include <iostream>
#include <functional>
#include <thread>
#include <vector>

class t {
public:
    int m = 1;
    std::function<void()> f;
    t() {
        f = [this]() {
            std::cout << "2: " << this << std::endl;
            std::cout << m << std::endl;
        };
    }
    void operator()() {
        m = 2;
        std::cout << "1: " << this << std::endl;
        f(); // print 1
    }
};

int main() {
    std::vector<std::thread> threads;
    for(int i = 1; i <= 1; i++) {
        threads.emplace_back(t());
    }
    for (auto &thread : threads) {
        thread.join();
    }
}

 , , ,

babushka ()

SEZE II - модные видео гличи на C++

SEZE II

Для наложения эффектов на видео, можно использовать фильтры FFmpeg или Frei0r плагины, но я написал свою программу с CLI и GUI интерфейсом, которая позволяет использовать фильтры из плагинов в многопотоке и отображать результат обработки через SDL2.

Как это выглядит?

Где качать?

Программу вы можете скачать с Гитхаба или Sourceforge. Для Линукса установите зависимости: FFmpeg, SDL2. Если хотите собрать из исходников, то скачайте SCons и последнюю версию компилятора C++

Как сделать свой эффект?

Скачайте API для создания плагинов и поглядите пример фильтра инверсии цвета. В итоге вы получите .so файл, если собираете на Линуксе, и затем вы откроете ваш плагин с помощью SEZE передав путь до него через опцию --plug. Используйте любую технологию для обработки изображений и любые оптимизации.

Ещё инфа

  • Код открытый, можете делать что хотите
  • Можно отправлять мне свои плагины, они пойдут в следующий релиз, код не обязателен
  • На Хабре есть статья по видео плагинам в разных программах
  • Есть паблик ВК с новостями о новых эффектах

 , , , ,

HPW-dev ()

Как неявный каст signed в unsigned сделать ошибкой?

>>> cat test.cpp
int foo(unsigned x) {
	
}

int main() {
	foo(-1);
	return 0;
}

>>> g++ -Wall -Wextra test.cpp

Хочу чтобы компилятор меня посылал когда я пытаюсь передать отрицательное число в unsigned тип неявно вместо того чтобы -1 внезапно становилась 4294967295. Такое поведение ведет к очень плохим багам.

И разрешал мне если я явно попрошу. Те foo(unsigned(-1))

 , ,

bga_ ()

Передать в parameter pack индексы

Товарищи, хочется так:

#include <array>
#include <tuple>
using namespace std;

struct Q {
    void set(int i) {}
};

template <int I>
struct S {
    Q mq[I];
    template <size_t ...num>
    void f(array<int, I> &a,
            index_sequence<num...> n=make_index_sequence<I>{}) {
        ((mq[num].set(a[num])), ...);
    }
};

int main() {
    S<3> s;
    array a{2, 5, 7};
    s.f(a);
}

Но почему-то не выходит передать make_index_sequence{} в качестве дефолтного аргумента. Работает, если над f вызовом накостылить обёртку:

	template <size_t ...num>
	void f_ok(array<int, I> &a) {
		f(a, make_index_sequence<I>{});
	}

и дёргать её, но наличие доп сущности восторг не вызывает. Может есть ещё какой вариант передать в parameter pack индексы без подобного (f_ok()) костыля?

 

kvpfs ()

С++23 уже почти здесь

по мотивам прошлой темы: Вести с полей стандартизации C++: C++20 design is complete (Kona, 2019-02)

Появился пост на reddit в котором можно увидеть какие ещё предложения войдут в С++23, возможно войдут в С++23, и не войдут: https://old.reddit.com/r/cpp/comments/qug17i/c23_near_the_finish_line/

Также можно увидеть что уже вошло в С++23 https://en.cppreference.com/w/cpp/compiler_support/23

Жалко, что

P1673 (P1385)	A free function linear algebra interface based on the BLAS	[9] NO
P1385 (P1673)	A proposal to add linear algebra support to the C++ standard library   [9] NO

Но тем не менее получилось не мало.

Кстати, если у вас есть негативный опыт с ranges_v3 и Boost.Range, то std::ranges гораздо более оптимизирован к скорости компиляции:

https://www.reddit.com/r/cpp/comments/qug17i/c23_near_the_finish_line/hkw97si/

 ,

fsb4000 ()

Xubuntu 21.10. Почему кнопка на gtk форме не работает?

Есть код:

#include <gtk/gtk.h>
static void activate(GtkApplication *app, void *user_data) {
    GtkWidget *window = gtk_application_window_new(app);
    GtkWidget *win = gtk_window_new ();
    gtk_window_set_application (GTK_WINDOW (win), GTK_APPLICATION (app));
    gtk_window_set_default_size (GTK_WINDOW (win), 400, 300);
    gtk_widget_show (win);

    GtkWidget *lab = gtk_label_new ("Hello.");
    gtk_window_set_child (GTK_WINDOW (win), lab);
    gtk_widget_show (win);


    GtkWidget *box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
    gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
    gtk_window_set_child (GTK_WINDOW (win), box);

    GtkWidget *btn1 = gtk_button_new_with_label ("Hello.");
    g_signal_connect (btn1, "clicked",G_CALLBACK (gtk_window_close), NULL);
    GtkWidget *btn2 = gtk_button_new_with_label ("Quit");
    g_signal_connect (btn2, "clicked", G_CALLBACK (gtk_window_close), win);

    gtk_box_append (GTK_BOX (box), btn1);
    gtk_box_append (GTK_BOX (box), btn2);

    gtk_widget_show (win);

}

int main(int argc, char *argv[]) {
    g_autoptr(GtkApplication) app = gtk_application_new(NULL, G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);

    return g_application_run(G_APPLICATION(app), argc, argv);
}

Скриншот: https://ibb.co/XsFwZgr

Данная код в xubuntu 21.04 .. в нем нормально кнопка Quit закрывала приложение. Но в xubuntu 21.10 данный код не работает, кнопка Quit не закрывает приложение. Что делать?

 ,

wersto8top ()

C++ Middle Full Stack Developer

Компания ООО «Кортех» приглашает на работу программиста, хорошо знакомого с программированием на языке C++ на платформе «Эльбрус». Наша компания занимается проектированием, подготовкой и поставкой установок по исследованию нефти и керна. Мы расположены в г. Мытищи (Москва и МО).

Мы решили развиваться в области отечественного ПО и железа, для чего ищём хорошего специалиста в данной области.

Обязанности:

• Создание архитектуры приложений для установок и приборов с последующей реализацией;

• Возможность принять участие в выборе инструментов для разработки ПО;

Требования:

• Знание Linux на среднем уровне;

• Хорошее знание C++ и Qt;

• Готовность ездить в командировки для проведения ПНР (по России);

Приветствуется:

• Желание разбираться в разработке под новую платформу – Эльбрус;

Условия:

• Оформление в соответствии с ТК РФ;

• Заработная плата по результатам собеседования;

• Возможность профессионального и карьерного роста;

• Возможность работать удалённо - первое время будет необходимо ездить в офис для написания и отладки программ, после чего возможно удалённо запускать установку с уже готовой программой при помощи наших сотрудников;

• Испытательный срок – 3 месяца.

Заработная плата:

•120.000 - 140.000 руб.

Телефон для связи: 8(964)634-06-90 e-mail: nrv@kortekh.ru

 , ,

Beefy_Liver ()

Удалить из строки ударение и подобное

Всем здрасьте.
Взял я boost::locale для операций с Юникодом, и пока не понял - а как удалить из строки знаки ударения (хотя там может быть и другой мусор однозначно). С наскоку сделал декомпозицию с case folding’ом - не помогает:

#include <boost/locale.hpp>
#include <iostream>
#include <string>
#include <locale>
using namespace boost::locale;
using namespace std;
 
int main() {
	wstring str = L"фыва\u00b4"; // "фыва" с ударением на 'а'
	generator gen;
	locale::global(gen(""));
	wstring res = normalize(str, boost::locale::norm_nfd);
	fold_case(res);
	cout << str.size() << "  " << res.size() << endl;
}

// cout: 5 5

На стековерфлоу есть подобный вопрос, там советовали вручную парсить строку для поиска ударений, это явно странно. Как правильно?

 , , , ,

kvpfs ()

Отказываются создаваться страницы wxNotebook

имеется arhclinux, wxwidgets, c++ (gcc)
код:
mainwindow.cpp

#include "mainwindow.hpp"

#include <stdexcept>

MainWindow::MainWindow() :
wxFrame( nullptr, wxID_ANY, "WEGA-HPG-cpp-wx" ), mMainPanel( new wxPanel() ),
mTabs( new wxNotebook() ) {
    mMainPanel->SetParent( this );
    mTabs->SetParent( mMainPanel );

    auto panel = new wxPanel();

    mTabs->AddPage( panel, "TAB1" );

    mTabs->Show();
    mMainPanel->Show();
}


mainwindow.hpp
#include <wx/wx.h>
#include <wx/panel.h>
#include <wx/notebook.h>

#include <vector>

class MainWindow : public wxFrame {
public:
    MainWindow();

    ~MainWindow() = default;

private:
    wxPanel *    mMainPanel;
    wxNotebook * mTabs;

    std::vector< wxPanel * > mPanels;
};


main.cpp
#include "ui/mainwindow.hpp"

#include <iostream>
#include <wx/chartype.h>
#include <wx/init.h>
#include <wx/wx.h>

#include <cstdlib>

class HpgApp final : public wxApp {
    bool OnInit() override {
        MainWindow * mainwindow = new MainWindow;
        mainwindow->CreateStatusBar();
        mainwindow->SetStatusText( "HPG status" );
        mainwindow->Show();

        //std::cout << "TEST" << std::endl;

        //SetTopWindow( mainwindow );
        return true;
    }
    //MainWindow mainwindow;
};
//DECLARE_APP( HpgApp )
//IMPLEMENT_APP( HpgApp )
int main( int argc, char ** argv ) {
    [[maybe_unused]] HpgApp * app = new HpgApp;

    wxEntry( argc, argv );
    return EXIT_SUCCESS;
}


при запуске получается
./src/gtk/notebook.cpp(409): assert "m_widget != __null" failed in InsertPage(): invalid notebook
zsh: trace trap (core dumped)  ./src/wega-hpg-cpp-wx


решение: тут и тут

 ,

safocl ()

OpenGL без привязки к окну?

Сабж. Нужно нарисовать картинку (по пикселям), средствами OpenGL, но не привязываясь к окну. То есть рисовать надо в память и потом эту память отдать (записать в файл скажем).

Не привязываясь к окну - потому что X-сервера может не быть (зашли по ssh без -X).

Это вообще возможно? Все что нагуглилось, вроде вот такого,

http://renderingpipeline.com/2012/05/windowless-opengl/

все таки подразумевает что какой то X-сервер есть, насколько я понял, просто окно не отображается.

PS в этих вопросах я нуб, сорри;-(

 , , ,

AntonI ()

insert or update by std::map iterator

Имеется:

std::map<K,V> cache;
void updateCache(K k, V v) {
    auto it = cache.find(k);
    if (it == cache.end() || it->second.value != v) {
        cache[k] = v;
        persistCache();
    }
}

Как бы мне в строчке cache[k] = v; избежать повторного поиска ключа в map, а заюзать вместо этого уже имеющийся it?

 ,

dimgel ()

Аналог winapi-шной getaddrinfoex в Linux

Здравствуйте,

Подскажите пожалуйста, есть ли в Linux’e аналог винапишной функции getaddrinfoex, которая в свою очередь является рамширением стандартной функции getaddrinfo из сокетов для запроса соответсвия URL адресса —> ip адрессу в асинхронном режиме, а не в блокирующем, как getaddrinfo ?

 , ,

Optimus1 ()