Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
7 / 7 / 3
Регистрация: 27.05.2017
Сообщений: 89
Записей в блоге: 10

Запустить файл cpp из командной строки

24.08.2017, 22:28. Показов 9087. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сейчас читаю книгу Kaehler A., Bradski G. - Learning OpenCV 3 Computer Vision in C++ with the OpenCV Library - 2017. К ней есть примеры, вот один из них.

Название файла: example_02-01.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
 
int main( int argc, char** argv ) {
 
Mat img = imread( argv[1], -1 );
 
if( img.empty() ) return -1;
namedWindow( "Example1", cv::WINDOW_AUTOSIZE );
imshow( "Example1", img );
waitKey( 0 );
destroyWindow( "Example1" );
}
В книге автор учит, как этот файл запустить из командной строки.

Вот этот текст:

Clearly, build instructions are highly platform dependent. In this book we do not generally cover platformspecific details, but here is an example of what a build instruction might look like in a UNIX-like environment: gcc -v example2_2.cpp -I/usr/local/include/ -L/usr/lib/ -lstdc++ -L/usr/local/lib -lopencv_highgui -lopencv_core - -o example2_2 . Note that the various components of the library are usually linked separately.

Но у меня не получается это сделать: я ввожу в Ubuntu в терминале:

gcc -v example_02-01.cpp -I/usr/local/include/ -L/usr/lib/ -lstdc++ -L/usr/local/lib -lopencv_highgui -lopencv_core - -o example2_2

На выходе получаю:
gcc: error: -E or -x required when input is from standard input


Пытаюсь по-другому:

gcc -v example_02-01.cpp -I/usr/local/include/ -L/usr/lib/ -lstdc++ -L/usr/local/lib -lopencv_highgui -lopencv_core -o example2_2

Тоже не выходит: вылезает много-много текста, а в конце надпись: //usr/local/lib/libopencv_imgcodecs.so.3.3: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

Запустил по-другому: (box.png - картинка) gcc example_02-01.cpp box.png

Тоже ошибка:

box.png: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status

Так как мне этот файл cpp запустить из командной строки правильно?

Добавлено через 1 час 13 минут
Update:

Задачу я решил обходным путём с помощью библиотеки QT. Вот код:

Файл с расширением pro, взял по умолчанию и добавил в него пару строк:

INCLUDEPATH += /usr/local/include/opencv2
LIBS += -L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_highgui

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#-------------------------------------------------
#
# Project created by QtCreator 2017-08-24T14:52:04
#
#-------------------------------------------------
 
QT       += core gui
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
TARGET = untitled1
TEMPLATE = app
 
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
 
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 
INCLUDEPATH += /usr/local/include/opencv2
LIBS += -L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_highgui
 
SOURCES += \
        main.cpp \
        mainwindow.cpp
 
HEADERS += \
        mainwindow.h
 
FORMS += \
        mainwindow.ui
А вот сама программа: убрал arg, и вместо этого загрузил картинку явным образом, то есть указал для картинки путь:

cv::Mat img = cv::imread("/home/mtw/Downloads/Learning-OpenCV-3_examples-master/adrian.jpg");

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    cv::Mat img = cv::imread("/home/mtw/Downloads/Learning-OpenCV-3_examples-master/adrian.jpg");
 
    //if( img.empty() ) return -1;
 
    cv::namedWindow( "Example 2-1", cv::WINDOW_AUTOSIZE );
    cv::imshow( "Example 2-1", img );
    cv::waitKey( 0 );
    cv::destroyWindow( "Example 2-1" );
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}

Программа работает: картинка выводится, но хотелось бы научиться запускать файл cpp через командную строку с передачей в неё аргументов, это должно делаться как-то очень просто.

Добавлено через 28 минут
Update:

Оказывается, без передачи аргументов файл можно запустить так, и это работает. Скажем, есть программа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//Example 2-1. A simple OpenCV program that loads an image from disk and displays it
//on the screen
#include <opencv2/opencv.hpp>
 
/*
void help(char** argv ) {
    std::cout << "\n"
    << "A simple OpenCV program that loads and displays an image from disk\n"
    << argv[0] <<" <path/filename>\n"
    << "For example:\n"
    << argv[0] << " ../fruits.jpg\n"
    << std::endl;
}
 
*/  
 
int main( int argc, char** argv ) {
    
    /*
    if (argc != 2) {
        help(argv);
        return 0;
    }
    */  
  
  //cv::Mat img = cv::imread( argv[1], -1 );
  
  cv::Mat img = cv::imread("/home/mts/Downloads/Learning-OpenCV-3_examples-master/adrian.jpg");  
    
  //if( img.empty() ) return -1;
 
  cv::namedWindow( "Example 2-1", cv::WINDOW_AUTOSIZE );
  cv::imshow( "Example 2-1", img );
  cv::waitKey( 0 );
  cv::destroyWindow( "Example 2-1" );
 
  return 0;
}
Если запустить в терминале следующую строку, то всё будет работать:
g++ -ggdb example.cpp -o output `pkg-config --cflags --libs opencv`

Но остался вопрос: а как запустить программу в терминала, чтобы передать аргумент -- ссылку на картинку, то есть у нас есть такая программа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//Example 2-1. A simple OpenCV program that loads an image from disk and displays it
//on the screen
#include <opencv2/opencv.hpp>
 
/*
void help(char** argv ) {
    std::cout << "\n"
    << "A simple OpenCV program that loads and displays an image from disk\n"
    << argv[0] <<" <path/filename>\n"
    << "For example:\n"
    << argv[0] << " ../fruits.jpg\n"
    << std::endl;
}
 
*/  
 
int main( int argc, char** argv ) {
    
    /*
    if (argc != 2) {
        help(argv);
        return 0;
    }
    */  
  
  cv::Mat img = cv::imread( argv[1], -1 );
  
  //cv::Mat img = cv::imread("/home/mts/Downloads/Learning-OpenCV-3_examples-master/adrian.jpg");  
    
  //if( img.empty() ) return -1;
 
  cv::namedWindow( "Example 2-1", cv::WINDOW_AUTOSIZE );
  cv::imshow( "Example 2-1", img );
  cv::waitKey( 0 );
  cv::destroyWindow( "Example 2-1" );
 
  return 0;
}
Как нужно изменить этот код (запускается в терминале):
g++ -ggdb example.cpp -o output `pkg-config --cflags --libs opencv`

Чтобы добавить в этот код картинку по адресу: "/home/mts/Downloads/Learning-OpenCV-3_examples-master/adrian.jpg" и чтобы всё тоже заработало?

Добавлено через 13 минут
Update:

Я нашёл ответ на свой вопрос: возвращаемся к исходному вопросу. Есть программа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
 
int main( int argc, char** argv ) {
 
Mat img = imread( argv[1], -1 );
 
if( img.empty() ) return -1;
namedWindow( "Example1", cv::WINDOW_AUTOSIZE );
imshow( "Example1", img );
waitKey( 0 );
destroyWindow( "Example1" );
}
Как её запустить из командной строки?

Ответ -- очень просто. Сначала её нужно скомпилировать наш файл выше под названием example.cpp с помощью следующей команды из терминала:

g++ -ggdb example.cpp -o output `pkg-config --cflags --libs opencv`

Мы получим на выходе файл output. Затем просто снова заходим в терминал и набираем

output fruit.jpg

Получаем на выходе картинку.

Всё будет работать. Думаю, что все остальные примеры автора из этой книги тоже будут работать по этому принципу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2017, 22:28
Ответы с готовыми решениями:

С помощью командной строки >namberstr f1.cpp Определить число строк в файле с именем f1.cpp
С помощью командной строки &gt;namberstr f1.cpp Определить число строк в файле с именем f1.cpp

Запустить файл Python из командной строки
Только начала изучать Python и уже где-то ошиблась. Изучаю язык по книге М.Лутца (4е издание). OC Win8.1, версия Python34. В качестве...

Как запустить файл python из командной строки?
Файл находится в библиотеке python (Lib) с расширением .py. как правильно указать путь через диск С и т.д.. Подскажите пожалуйста)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.08.2017, 22:28
Помогаю со студенческими работами здесь

Как запустить .cpp файл в Visual Studio
Скачал cpp файл с интернета но запустить его не могу, проверить в действии. Могу только присоединить к процессу как видно на картинке imgur...

Как скомилировать и запустить файл .cpp в KDevelop 4?
Здравствуйте Все! Неделю назад я установил себе Mandriva 2011, до этого никогда Linux не использовал. Решил попробывать написать програмку...

Как скомпилировать и запустить файл .cpp в IDE CodeLite?
Это IDE установлено в линуксе. Не активны надписи (серым цветом) в меню Build.

Как запустить код из командной строки?
Здравствуйте!! У меня такая беда маленькая, не могу запустить файл &quot;Prog.java&quot; с командной строки с помощью компилятора javac .......всё...

Не могу запустить программу из командной строки
from vk_api import VkApi from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType from datetime import datetime vk_session =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru