0

Столкнулся с ошибкой средств компоновщика. Текст ошибки ссылается на CreateFile() в main.cc и вызов CreateFile() в Task5() practice5.cc (возможно я не правильно что-то понял, поэтому текст ошибки будет ниже). Предполагаю ошибка из-за подводных камней анонимного пространства имен.
main.h

#ifndef MAIN_H_
#define MAIN_H_
#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

const int kIncorrectUserData = INT_MIN;

namespace main_functions { string CreateFile(); double DoubleInput(); int IntegerInput(); } // namespace main_functions #endif // MAIN_H_

main.cc

#include "main.h"

#include "marbles.h" #include "practice4.h" #include "practice5.h"

namespace main_functions { string CreateFile() { cout << "What do you want to name the text file?\n"; string filename, file_content; cin >> filename; ofstream file(filename + ".txt"); if (file.is_open()) { cout << "What do you want to enter in file? Enter 'break!' separate line " "for ending\n"; cin >> file_content; while (file_content != "break!") { file << file_content << "\r\n"; cin >> file_content; } file.close(); } else { cout << "Program cannot open this txt file\n"; } return filename + ".txt"; }

double DoubleInput() { // ... }

int IntegerInput() { // ... } } // namespace main_functions

int main() { // ... }

practice5.h

#ifndef PRACTICE5_PRACTICE5_H_
#define PRACTICE5_PRACTICE5_H_
#include <cmath>
#include <fstream>
#include <limits>

#include "main.h"

namespace practice5 { void Practice5Run(); } #endif // PRACTICE5_PRACTICE5_H_

practice5.cc

#include "practice5.h"

namespace inner { void swap(int* a, int* b) { // ... } } // namespace inner

namespace { int EuclideanAlgorithmByDivision(int first_number, int second_number) { // ... }

int EuclideanAlgorithmBySubtraction(int first_number, int second_number) { // ... }

void Task1() { // ... }

int* EratosthenesSieve(int i, int consistency_integers_size, int* consistency_integers) { // ... }

void Task2() { // ... }

void Task3() { // ...

void Task4() { // ... }

// AI automaticly-generated functions

int partition(int arr[], int low, int high) { // ... }

void quickSort(int arr[], int low, int high) { // ... } // Ending AI auto-generated functions

void DrawingTableInFile(ofstream& fout, string** array, const int kRowsCount, const int kColumnsCount) { // ... }

void ReverseArray(int arr[], int starting_element, int ending_element) { // ... }

void Task5() { cout << "Enter task number: '9' or '23'\n"; int task_number; task_number = main_functions::IntegerInput(); switch (task_number) { case 9: { const int kFilesCount = 2; ofstream fin("C.txt"); for (int file_number = 0; file_number < kFilesCount; file_number++) { ifstream fout(main_functions::CreateFile()); if (fout.is_open() and fin.is_open()) { const int kArraySize = 1000; int* array = new int[kArraySize]; array[0] = kArraySize; InitializingArray(fout, array, 1); quickSort(array, 1, array[0] - 1); for (int i = 1; i < array[0]; i++) fin << to_string(array[i]) << " "; delete[] array; fout.close(); } else { cout << "Program cannot open this txt files\n"; break; } } fin.close(); ifstream fout("C.txt"); if (fout.is_open()) { string file_content; while (getline(fout, file_content)) cout << file_content; fout.close(); fstream clear_file("C.txt", ios::out); clear_file.close(); } else { cout << "Program cannot open this txt file\n"; } } break; case 23: { // ... } break; default: cout << "Incorrect task number\n"; } } } // namespace namespace practice5 { void Practice5Run() { int command = 1; while (command != 0) { cout << "Enter task number separate digit or '0' for exit\n"; command = main_functions::IntegerInput(); if (command == 1) Task1(); else if (command == 2) Task2(); else if (command == 3) Task3(); else if (command == 4) Task4(); else if (command == 5) Task5(); else if (command == 0) break; else cout << "Wrong command.\n"; } } } // namespace practice5

Процесс сборки:

1>main.cc
1>marbles.cc
1>practice4.cc
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(153,54): warning C4244: аргумент: преобразование "double" в "const unsigned __int64", возможна потеря данных
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(373,31): warning C4002: слишком много аргументов для вызова макроса, подобного функции, "max"
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(375,40): warning C4002: слишком много аргументов для вызова макроса, подобного функции, "min"
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(377,44): warning C4002: слишком много аргументов для вызова макроса, подобного функции, "max"
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(379,44): warning C4002: слишком много аргументов для вызова макроса, подобного функции, "min"
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(389,14): warning C4267: инициализация: преобразование из "size_t" в "int"; возможна потеря данных
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(390,59): warning C4244: +=: преобразование "double" в "int", возможна потеря данных
1>practice5.cc
1>practice6.cc
1>Создание кода...
1>C:\Users\mag1s\source\repos\MIREA\Procedural programming\practice4.cc(357): warning C4715: `anonymous namespace'::GetVendor: значение возвращается не при всех путях выполнения
1>practice5.obj : error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl main_functions::CreateFile(void)" (?CreateFile@main_functions@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) в функции "void __cdecl `anonymous namespace'::Task3(void)" (?Task3@?A0x850a01fe@@YAXXZ).
1>C:\Users\mag1s\Source\Repos\MIREA\x64\Debug\Procedural programming.exe : fatal error LNK1120: неразрешенных внешних элементов: 1
1>Сборка проекта "Procedural programming.vcxproj" завершена с ошибкой.

UPD: Ссылка на неразрешенный внешний символ (возможные причины) Не дает мне ответа на вопрос, т.к. в коде не используются сторонние библиотеки, у CreateFile() есть объявление, файлы с кодом комплилруются, в нем нет классов и присутствует внешнее связывание.

Ilya
  • 45
  • очень похоже, что main.cc просто не попал в сборку. см тут раздел "Файл с кодом не был скомпилирован" – αλεχολυτ Mar 02 '24 at 10:02
  • Заверяю, что у CreateFile() одно определение и объявление. чтобы все работало об этом должен еще занать линкер. А вместо голословных заявлений следует приводить [mcve] включая полный лог сборки, а то выяснится, что файл main.cc в сборке участия не принимал вообще. – user7860670 Mar 02 '24 at 10:03
  • Помогло изменение названия идентификатора функции во всем проекте, возможно конфликт имен с внешними зависимостями или баг VS – Ilya Mar 02 '24 at 11:08
  • 1
    "баг VS" - такие сильные заявления необходимо подкреплять, приводя [mcve]. Обрывки собственного кода таким не считаются. В тексте ошибки фигурирует использование идентификатора в функции Task3, которого в вопросе не видно. Ну а раз помогло изменение идентификаторов, то вероятно, что в каком-то из них было что-то не так, например присутствовал непечатаемый символ или еще какие-нибудь атавизмы копипасты. Еще кстати обязательно следует исправить C4715. – user7860670 Mar 02 '24 at 11:32

0 Answers0