Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2018, 13:52   #1
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию Ошибка преобразования при сборке динамической библиотеки

При сборке программы с динамической библиотекой позднего связывания вылазит ошибка:
Цитата:
Ошибка инициализация: невозможно преобразовать "void *" в "int (*)(std::experimental::filesystem:: v1:: path &,std::experimental::filesystem::v1 :: path &)"
Пробовал как-нибудь преобразовать к одному типу, но не вышло. Может быть кто-нибудь знает как можно решить данную проблему.
Исполняемый файл:
Код:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <experimental/filesystem>
#include <dlfcn.h>

namespace fs = std::experimental::filesystem;

extern "C" void reverseFile(fs::path pfile1, fs::path const& pfile2);
//extern "C" fs::path newPath(fs::path const& oldPth, fs::path const& pd1, fs::path const& pd2);
extern "C" void fullReverse(fs::path& pd1, fs::path& pd2);

int main()
{
	fs::path pd1("C:\\Users\\Alex\\Videos\\dir1"); // каталог с исходными файлами
	fs::path pd2("C:\\Users\\Alex\\Videos\\dir2"); // каталог с инвертированными файлами
	void *handle = dlopen("lib_MYDYNAMIC.so", RTLD_LAZY);
	int(* fun)(fs::path& pd1, fs::path& pd2) = (int*)dlsym(handle, "fullReverse");
	(*fun)(pd1, pd2);
	dlclose(handle);
}
Файл библиотеки dinamic.h:
Код:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;


extern "C" void reverseFile(fs::path pfile1, fs::path const& pfile2)
{
	std::fstream ifs(pfile1, std::ios::in | std::ios::binary), ofs(pfile2, std::ios::out | std::ios::binary);
	if (ifs.is_open() && ofs.is_open())
	{
		ifs.seekg(0, ifs.end);
		if (ifs.tellg() >= std::streampos(1))
		{
			for (ifs.seekg(-1, ifs.cur); ; ifs.seekg(-2, ifs.cur))
			{
				ofs.put(ifs.get());
				if (ifs.tellg() == std::streampos(1))
				{
					break;
				}
			}
		}
	}
	else
	{
		std::cerr << "Unable to open file(s): " << pfile1 << "  " << pfile2 << "\n\n";
	}
	ifs.close();
	ofs.close();
}

// создаём путь папки в каталоге с инвертированными файлами
fs::path newPath(fs::path const& oldPth, fs::path const& pd1, fs::path const& pd2)
{
	fs::path ret = pd2;
	auto pr = std::mismatch(oldPth.begin(), oldPth.end(), pd1.begin(), pd1.end());

	for (auto ib(pr.first), ie(oldPth.end()); ib != ie; ++ib)
	{
		ret /= *ib;
	}

	return ret;
}

extern "C" void fullReverse(fs::path& pd1, fs::path& pd2)
{
	try
	{
		//fs::path pd1("C:\\Users\\Alex\\Videos\\dir1"); // каталог с исходными файлами
		//fs::path pd2("C:\\Users\\Alex\\Videos\\dir2"); // каталог с инвертированными файлами
		if (!fs::exists(pd2))
		{
			fs::create_directories(pd2); // может кинуть исключение
		}
		for (fs::recursive_directory_iterator ib(pd1), ie; ib != ie; ++ib) // перебираем все файлы в dir 1
		{
			if (fs::is_regular_file(ib->path())) // инвертируем каждый файл 
			{
				reverseFile(ib->path(), newPath(ib->path(), pd1, pd2));
			}
			else if (fs::is_directory(ib->path())) // создаём папку в каталоге с инвертированными файлами
			{
				fs::create_directory(newPath(ib->path(), pd1, pd2));
			}
		}

	}
	catch (std::exception const& exc)
	{
		std::cerr << "Exception: " << exc.what() << std::endl;
	}
}

Последний раз редактировалось Alexis_777; 22.04.2018 в 14:00.
Alexis_777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
rpm-maven-plugin ошибка при сборке wiremann Общие вопросы по Java, Java SE, Kotlin 1 03.09.2017 19:23
Ошибка при сборке программы Solaire Общие вопросы C/C++ 2 09.07.2017 23:20
Ошибка при сборке boost на Windows gunsoy Общие вопросы C/C++ 23 04.09.2015 20:12
Ошибка при сборке ( выпуск) номер -1073741511 lexflax Qt и кроссплатформенное программирование С/С++ 1 16.11.2013 16:33
Ошибка при сборке проекта в QT. JoberLord Qt и кроссплатформенное программирование С/С++ 4 17.04.2010 16:33