Создайте автономный исполняемый файл для MacOS с помощью OpenCV и libmagic.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Создайте автономный исполняемый файл для MacOS с помощью OpenCV и libmagic.

Сообщение Anonymous »

В настоящее время я пытаюсь скомпилировать свою программу как автономную.
Я использую MacOS M2, и целевая операционная система также является MacOS M2. Я хочу просто перетащить исполняемый файл с одного Mac на другой и запустить его ничего не устанавливая...
Прежде всего, я' Я не уверен, что это вообще возможно, а во-вторых, я не очень хорошо разбираюсь в этих вещах (правильная компиляция, статическое связывание и т. д.).
Я пытался статически скомпилировать OpenCV и libmagic (из "файл"), и я действительно не знаю, что я сделал не так, но я думаю, что OpenCV построен неправильно...
Вот источники, которые я использовал: (Редактировать:)Текущая ошибка возникает при компиляции с использованием большой команды g++ (которую вы можете увидеть ниже в этом посте).
Рассматриваемая ошибка:
ld: library not found for -lopencv_viz clang: error: linker command failed with exit code 1 (use -v to see invocation)
Я проверил исходники модуля viz (и смог их найти).
Я правильно включаю папку «include» модуля viz, поэтому не знаю, почему это невозможно нашел его с помощью -lopencv_viz...
Вот текущая команда, которую я использую для компиляции:
g++ -std=c++17 pkg-config --static --cflags --libs libmagic pkg-config --static --cflags --libs opencv4 -o image_indexer image_indexer.cpp
Что переводится как:
g++ -std=c++17 -I/opt/homebrew/Cellar/libmagic/5.45/include -L/opt/homebrew/Cellar/libmagic/5.45/lib -lmagic -llzma -lbz2 -lz -I/opt/homebrew/opt/opencv/include/opencv4 -L/opt/homebrew/opt/opencv/lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_wechat_qrcode -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core -o image_indexer image_indexer.cpp
Итак, вот программа, о которой идет речь:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;
namespace fs = filesystem;
mutex mtx;

class ThreadPool {
public:
ThreadPool( size_t length ) : stop( false ), finishedThreads( 0 ), totalThreads( 0 ) {
for( size_t i = 0; i < length; ++i ) {
threads.emplace_back( [this] {
while( true ) {
function task;
{
unique_lock lock( queueMutex );
condition.wait( lock, [this] { return stop || ! tasks.empty(); } );
if( stop && tasks.empty() ) return;
task = std::move( tasks.front() );
tasks.pop();
}
task();
{
lock_guard lock( counterMutex );
++finishedThreads;
if( finishedThreads == totalThreads ) {
threadsFinished.notify_one();
}
}
}
} );
}
}
template
void push( F&& task ) {
{
unique_lock lock( queueMutex );
tasks.push( std::forward( task ) );
}
condition.notify_one();
}
void waitAll( int total ) {
unique_lock lock( counterMutex );
totalThreads = static_cast( total );
threadsFinished.wait( lock, [this] { return finishedThreads == totalThreads; } );
}
~ThreadPool() {
{
unique_lock lock( queueMutex );
stop = true;
}
condition.notify_all();
for( auto& thread : threads )
thread.join();
}
private:
vector threads;
queue tasks;
mutex queueMutex;
mutex counterMutex;
condition_variable condition;
condition_variable threadsFinished;
size_t finishedThreads;
size_t totalThreads;
bool stop;
};

bool isFileReadable( const string& filePath ) {
try {
fs::file_status status = fs::status( filePath );
return fs::is_regular_file( status ) && ( ( status.permissions() & fs::perms::owner_read ) != fs::perms::none );
} catch( const fs::filesystem_error& e ) {
cerr 6 );
char_array_4[ 3 ] = char_array_3[ 2 ] & 0x3F;
for( i = 0; i < 4; i++ ) {
result += base64_chars[ char_array_4[ i ] ];
}
i = 0;
}
}
if( i ) {
for( j = i; j < 3; j++ ) {
char_array_3[ j ] = '\0';
}
char_array_4[ 0 ] = ( char_array_3[ 0 ] & 0xFC ) >> 2;
char_array_4[ 1 ] = ( ( char_array_3[ 0 ] & 0x03 ) > 4 );
char_array_4[ 0 ] = ( ( char_array_3[ 1 ] & 0x0F ) > 6 );
char_array_4[ 0 ] = char_array_3[ 2 ] & 0x3F;
for( j = 0; j < i + 1; j++ ) {
result += base64_chars[ char_array_4[ j ] ];
}
while( i++ < 3 ) {
result += '=';
}
}
return result;
}

cv::Mat resizeImage( const cv::Mat& image, const int& width, const int& height ) {
cv::Mat resized;
cv::resize( image, resized, cv::Size( width, height ), 0, 0, cv::INTER_AREA );
return resized;
}

string encodeToBase64( const cv::Mat& image ) {
vector buffer;
cv::imencode( ".jpg", image, buffer );
return base64_encode( buffer.data(), buffer.size() );
}

string getFileMime( const string& filePath ) {
magic_t magicCookie = magic_open( MAGIC_MIME_TYPE );
if( magicCookie == NULL ) {
return "unknown";
}
magic_load( magicCookie, NULL );
const char* mimeType = magic_file( magicCookie, filePath.c_str() );
string mimeTypeString = mimeType ? mimeType : "unknown";
magic_close( magicCookie );
return mimeTypeString;
}

void processImage( const string outputFile, const string& filePath, const int& width, const int& height, bool verbose=false ) {
if( ! isFileReadable( filePath ) ) return;
fs::directory_entry fileEntry( filePath );
string mime = getFileMime( filePath );
string fileName = fileEntry.path().filename().string();
if( startsWith( mime, "image/" ) ) {
cv::Mat image = cv::imread( filePath );
if( ! image.empty() ) {
cv::Mat resizedImage = resizeImage( image, width, height );
string base64Data = encodeToBase64( resizedImage );
string tempContent = R"(

)";
tempContent += "
Изображение
";
tempContent += R"(

Nom : )";
tempContent += fileName;
tempContent += R"(


)";
writeHTML( tempContent, outputFile );
if( verbose ) cout

Подробнее здесь: https://stackoverflow.com/questions/782 ... d-libmagic
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Один автономный исполняемый файл интерпретатора Python.
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Компиляция PHP в автономный исполняемый файл (быстрее?)
    Anonymous » » в форуме Php
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Создайте собственный исполняемый файл Spring-Boot на MacOS для запуска в док-контейнере Linux.
    Anonymous » » в форуме Linux
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Упакуйте исполняемый файл ffmpeg в исполняемый файл myProject для запуска.
    Anonymous » » в форуме Python
    0 Ответы
    148 Просмотры
    Последнее сообщение Anonymous
  • Неверный исполняемый файл. Исполняемый файл appname.app/Frameworks/hermes.framework/hermes содержит битовый код. (ИД: ХХ
    Anonymous » » в форуме IOS
    0 Ответы
    79 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»