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

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

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

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

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

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

Проблема такая, хотел создать статическую библиотеку, но при компиляции вылазят ошибки. Помогите разобраться в чём проблема)
Сама сборка:
  • Компиляция библиотеки:
    g++ -c static.cpp -o static.o
  • Сборка и индексация библиотеки:
    ar rc lib_MYSTATIC.a static.o
    ranlib lib_MYSTATIC.a
  • Компиляция и линковка программы с библиотекой:
    g++ main.cpp -L. lib_MYSTATIC.a -o static.out
При выполнении компиляции такие ошибки:
Код:
main.cpp: In function ‘int main()’:
main.cpp:22:69: error: ‘newPath’ was not declared in this scope
                 reverseFile(ib->path(), newPath(ib->path(), pd1, pd2));
                                                                     ^
main.cpp:22:70: error: ‘reverseFile’ was not declared in this scope
                 reverseFile(ib->path(), newPath(ib->path(), pd1, pd2));
                                                                      ^
main.cpp:26:66: error: ‘newPath’ was not declared in this scope
                 fs::create_directory(newPath(ib->path(), pd1, pd2));
                                                                  ^
Исходный код библиотеки static.c:
Код:
#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();
}
 
// создаём путь папки в каталоге с инвертированными файлами
extern "C" 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;
}
Исходный код программы (main.cpp):
Код:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;

int main()
{
    try
    {
        fs::path pd1("/home/student/dir1"); // каталог с исходными файлами
        fs::path pd2("/home/student/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;
    }
}
Cобирал по гайду http://radist-elvin.blogspot.com.by/2008/07/linux.html

Последний раз редактировалось Alexis_777; 22.04.2018 в 00:52.
Alexis_777 вне форума Ответить с цитированием
Старый 22.04.2018, 03:27   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Так а где

#include "static.h"

внутри main.cpp ?

Ну или скопировать прототипы

Код:
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);



int main()
alexzk вне форума Ответить с цитированием
Старый 22.04.2018, 07:37   #3
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию

Это сборка под Linux. Там по другому. Ссылка в конце поста.
Alexis_777 вне форума Ответить с цитированием
Старый 22.04.2018, 09:57   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Alexis_777 Посмотреть сообщение
Там по другому
Там то же самое.
Но если вы все знаете, зачем вы тратите на нас время?
waleri вне форума Ответить с цитированием
Старый 22.04.2018, 10:09   #5
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Alexis_777 Посмотреть сообщение
Это сборка под Linux. Там по другому. Ссылка в конце поста.
Причем тут линукс? Это принцип работы компилятора и языка.
Кстати, тот гайд не по "линукс", а скорее по GCC. На винде все так же, за исключением -fPIC, на винде он есть всегда и не пользовать его не возможно. Поэтому сам флаг, вроде, совсем отсутствует.

Последний раз редактировалось alexzk; 22.04.2018 в 10:12.
alexzk вне форума Ответить с цитированием
Старый 22.04.2018, 10:24   #6
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Кстати, вы же понимаете, что параметры ф. у вас классы? Т.е. нельзя использовать extern "C", т.к. там классов нет...собссно потому вы и делаете статик, что его можно пользовать с С++ без доп. проблем.
alexzk вне форума Ответить с цитированием
Старый 22.04.2018, 10:51   #7
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Кстати, вы же понимаете, что параметры ф. у вас классы? Т.е. нельзя использовать extern "C", т.к. там классов нет...собссно потому вы и делаете статик, что его можно пользовать с С++ без доп. проблем.
Смог собрать с прототипами)) Не сразу заметил что в С++ их нужно в программу добавлять. Это по заданию нужно вынести всю функциональную часть в статическую библиотеку. Это совсем неправильно или так можно? Вот только я пока не понял является ли то что я в main оставил, а именно сам цикл функциональной частью или нет.

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать wrapper для статической библиотеки для использования в С# проекте GonzA C# (си шарп) 5 18.03.2015 13:24
Сборка статической библиотеки с mingw ArmanPrestige Общие вопросы C/C++ 1 17.03.2015 01:34
Ошибка при компиляции библиотеки классов llARXANGELll C# (си шарп) 12 27.10.2012 22:27
как из программы на с++ сделать программу с исползованием статической библиотеки Slavik3 Общие вопросы C/C++ 1 04.10.2012 20:41
Подключение статической библиотеки к C# К_І C# (си шарп) 2 11.11.2011 15:41