2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Error LNK2005 MS VS C++ Совсем непонятно.
Сообщение28.07.2020, 18:26 
Аватара пользователя
Линковщик выдает ошибку:
Код:
Severity   Code   Description   Project   File   Line   Suppression State
Error   LNK2005   "class std::vector<unsigned char,class std::allocator<unsigned char> > __cdecl Read_file_binary_(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?Read_file_binary_@@YA?AV?$vector@EV?$allocator@E@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) already defined in segment.obj   segment

Упомянутая переменная Read_file_binary_
Определена в header file:
Код:
std::vector<uint8_t> Read_file_binary_(const std::string & pathToFile)
{
    std::ifstream file(pathToFile, std::ios::binary);
    std::vector<uint8_t> fileBufferBytes;

    if (file.is_open())
    {
        file.seekg(0, std::ios::end);
        size_t sizeBytes = file.tellg();
        file.seekg(0, std::ios::beg);
        fileBufferBytes.resize(sizeBytes);
        if (file.read((char*)fileBufferBytes.data(), sizeBytes)) return fileBufferBytes;
    }
    else throw std::runtime_error("could not open binary ifstream to path " + pathToFile);
    return fileBufferBytes;
}


И используется всего раз:

Код:
if (preload_into_memory)
      {
         byte_buffer = Read_file_binary_(filepath);
         file_stream.reset(new memory_stream((char*)byte_buffer.data(), byte_buffer.size()));
      }


Судя по хелпу имя якобы упоминается два раза. Я как бы изменял несколько раз на всякий случай это имя, но с тем же успехом.
Кроме того. В другом проекте, правда более простом, никаких накладок не было.
Помогите люди добрые разобраться.

-- Вт июл 28, 2020 19:58:40 --

Примерно понял. Если кому интересно. Переставил опреределение читающей функии
std::vector<uint8_t> Read_file_binary_(const std::string & pathToFile){.....}
из хедера в корневой файл (main.cpp).
А так как мжду инклюдом #include "tinyply.h"
и читающим файлы фрагментом теперь появляется магическая тройка
extern "C" { FILE _iob[3] = {__acrt_iob_func(0), __acrt_iob_func(0), __acrt_iob_func(0)}; }
То с чтением файлов все теперь в порядке.

 
 
 
 Re: Error LNK2005 MS VS C++ Совсем непонятно.
Сообщение28.07.2020, 19:43 
MGM в сообщении #1476406 писал(а):
Определена в header file:


Не гарантирую, но может помочь приписать к этой функции inline, чтобы компилятору стало понятно, что множественные определения этой функции нужно слить в одно. Либо вынести определение функции в *.cpp файл, а в заголовочном файле оставить только объявление. Тогда inline, конечно, нужно убрать.

 
 
 
 Re: Error LNK2005 MS VS C++ Совсем непонятно.
Сообщение28.07.2020, 23:00 
MGM в сообщении #1476406 писал(а):
И используется всего раз
У Вас в header-файле исполняемый код. Функция используется всего раз, а сам h-файл инклюдится больше одного раза. Отсюда и ошибка. Ничего удивительного.

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group