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

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

24.08.2017, 22:28. Показов 8958. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru