Почему имя исходного файла влияет на компиляцию? - PullRequest
11 голосов
/ 09 февраля 2012

Я столкнулся с чем-то действительно странным, когда написал небольшую программу для лото на C ++ под названием "lotto.cpp". Все было хорошо, пока я не написал запись в файл для моей программы. Когда я скомпилировал, он показал мне следующую ошибку:

ld: can't open output file for writing: lotto, errno=21 for architecture x86_64
collect2: ld returned 1 exit status

По стечению обстоятельств я изменил название моей программы на «1.cpp», и она неожиданно скомпилировалась без проблем. Это также сработало, когда я изменил название на «test.cpp».

Мне действительно любопытно, почему это произошло. Есть идеи?

Это произошло на MacBook Pro.

Если вам нужен код, просто дайте мне знать!


Я знаю, что некоторые люди спрашивали код. Вот оно:

#include <iostream>
#include <fstream>

using namespace std;

const int NED  = 10;            
const int VIKING =  6;
const int NORMAL =  7;
const int MAX  = 10;

void quickSort(int arr[], int left, int right);
int checkDuplicates(int arr[], int length);

int main (int argc, const char *argv[])
{
    int i, j, k, ans;
    char ans2;
    int lottoNumbers[MAX];

    ofstream out("Lotto.txt", ios::out | ios::app);

    srand((unsigned)time(NULL));    

    do
    {
        do
        {
            cout << "\n\nDo you want to play Viking Lotto (press 6), or normal Lotto (press 7): ";
            cin >> ans;
        }while(ans != VIKING && ans != normal);

        (ans == VIKING) ? cout << "\nViking Lotto:\n" : cout << "\n\nnormal Lotto:\n";
        (ans == VIKING) ? out << "\nViking Lotto:\n" : out << "\n\nnormal Lotto:\n";


        for (i = 0; i < NED; i++)       //10 rows
        {       
            for (j = 0; j < ans; j++)  //6 or 7 columns
            {
                (ans == VIKING) ? lottoNumbers[j] = (rand() % 48) + 1 : lottoNumbers[j] = (rand() % 34) + 1;
            }
            if(checkDuplicates(lottoNumbers, ans) != -1)        
            {
                for(k = 0; k < ans; k++)
                {
                    while(checkDuplicates(lottoNumbers, ans) == lottoNumbers[k])    
                    {
                        (ans == VIKING) ? lottoNumbers[k] = (rand() % 48) + 1 : lottoNumbers[k] = (rand() % 34) + 1;
                    }
                }
            }
            quickSort(lottoNumbers, 0, ans - 1);  
            cout << '\n';

            for(j = 0; j < ans; j++)
            {
                cout << lottoNumbers[j] << '\t'; 
                out << lottoNumbers[j] << '\t';
            }
            out << '\n';

        }   
        cout << "\n\n";


        cout <<"Another lottery ticket (Y/N) ";
        cin >> ans2;
    }while(ans2 == 'j' || ans2 == 'J');

    cout << "\n\nLOTTO NUMBERS WAS WRITTEN TO FILE...\n\n";

    return 0;
}

void quickSort(int arr[], int left, int right) 
{
    int i = left, j = right;
    int tmp;
    int mid = arr[(left + right) / 2];

    while (i <= j) 
    {
        while (arr[i] < mid)    i++;
        while (arr[j] > mid)    j--;
        if (i <= j) 
        {
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    };
    if (left < j)   quickSort(arr, left, j);
    if (i < right)  quickSort(arr, i, right);
}

int checkDuplicates(int arr[], int length)  
{                                       
    for(int i = 0; i < length; i++)
    {
        for(int j = i + 1; j < length; j++)
        {   
            if(arr[i] == arr[j])    return arr[j];
        }
    }
    return -1;  
}

Ответы [ 4 ]

26 голосов
/ 09 февраля 2012

Ошибка № 21 (в MacOS X 10.7.2) - EISDIR: Is a directory.

Имя lotto представляется каталогом, а не файлом.

1 голос
/ 26 марта 2012

Да, я столкнулся с этой проблемой, скопировав часть кода Visual Studio на мой Mac. Кажется, Visual Studio любит создавать папки внутри вашего проекта с именем вашего исполняемого файла, что вызывает это!

1 голос
/ 09 февраля 2012

Это ошибка компоновщика, которая гласит, что мы не можем записать файл 'lotto' на вашем компьютере во время компиляции.Я предполагаю, что либо ваша программа все еще работает, либо вы случайно создали каталог под названием «лото».Возможно, ваша функция записи в файл поддерживает работу приложения или сама пыталась создать каталог лото.

0 голосов
/ 19 июля 2015

FWIW Я получил эту ошибку, когда пытался записать свой выходной файл в каталог, который еще не был создан, т.е. bin / myprogram.

Как только я создал каталог bin, все было в порядке;Мне не нужно было ничего переименовывать.Похоже, что GCC создает каталог, если он не существует, а clang - нет (по крайней мере, насколько я могу судить).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...