• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Ошибка при компиляции

  • Автор темы Автор темы sidjey
  • Дата начала Дата начала

sidjey

Новые
Регистрация
24 Фев 2011
Сообщения
25
Реакции
0
Баллы
0
Ошибка при компиляции

Здравствуйте, пытался сегодня откомпилировать сегодня исходный код программы, а мне при компиляции выдало след ошибку:
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [ls] Error 1


Linux(ubuntu 10.10), среда разработки Anjuta...
Что это вообще такое? что сделать, чтобы откомпилировалось нормально? если нужен будет текст выложу сюда! Заранее спасибо!:tehnari_ru_837:
 
возможно у вас нету функции void main() ?

или не объявлена _start
нужен код.
 
возможно у вас нету функции void main() ?

или не объявлена _start
нужен код.

да нет ни void main() ни int main()... но как дописать не знаю((( вот код...

Код:
#ifndef _VIEW_H
#define  _VIEW_H

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <iostream>
#include <pwd.h>
#include <grp.h>
#include <errno.h>

using namespace std;

int myView(bool l,bool r,const char* path)
{
  DIR* dir = opendir(path);
  if(!dir)
    return 1;

  struct dirent *rd;

  while((rd = readdir(dir)))
  {
    if(!strcmp(rd->d_name,".") || !strcmp(rd->d_name,".."))
    {
      continue;
    }
    struct stat entryInfo;
    char pathName[PATH_MAX+1];

    strncpy(pathName,path,PATH_MAX);
    strncat(pathName,"/",PATH_MAX);
    strncat(pathName,rd->d_name,PATH_MAX);

    if(!lstat(pathName,&entryInfo))
    {
      if(l)
      {
        switch(entryInfo.st_mode & S_IFMT)
        {
          case S_IFDIR:
          {
            cout << "d";
            break;
          }
          case S_IFIFO:
          {
            cout << "p";
            break;
          }
          case S_IFSOCK:
          {
            cout << "s";
            break;
          }
          case S_IFLNK:
          {
            cout << "l";
            break;
          }
          default:
            cout << "-";
        }

        //Владелец
        //read
        if(entryInfo.st_mode & S_IRUSR)
          cout << "r";
        else
          cout << "-";
        //write
        if(entryInfo.st_mode & S_IWUSR)
          cout << "w";
        else
          cout << "-";
        //execute
        if(entryInfo.st_mode & S_IXUSR)
          cout << "x";
        else
          cout << "-";

        //Группа
        //read
        if(entryInfo.st_mode & S_IRGRP)
          cout << "r";
        else
          cout << "-";
        //write
        if(entryInfo.st_mode & S_IWGRP)
          cout << "w";
        else
          cout << "-";
        //execute
        if(entryInfo.st_mode & S_IXGRP)
          cout << "x";
        else
          cout << "-";

        //Прочие
        //read
        if(entryInfo.st_mode & S_IROTH)
          cout << "r";
        else
          cout << "-";
        //write
        if(entryInfo.st_mode & S_IWOTH)
          cout << "w";
        else
          cout << "-";
        //execute
        if(entryInfo.st_mode & S_IXOTH)
          cout << "x";
        else
          cout << "-";

        cout << " ";
        struct passwd* pwd = getpwuid(getuid());
        struct group* grp = getgrgid(pwd->pw_gid);
        cout << " " << grp->gr_name << " " << pwd->pw_name << " ";
      }

      if(S_ISDIR(entryInfo.st_mode))
      {
        cout << rd->d_name << endl;
        if(r)
        {
          myView(l,r,pathName);
        }
      }else
      if(S_ISREG(entryInfo.st_mode))
      {
        cout << rd->d_name;
      }else
      if(S_ISLNK(entryInfo.st_mode))
      {        
        char targetName[PATH_MAX+1];
        if(readlink(pathName,targetName,PATH_MAX))
        {
          cout << rd->d_name << " link: "
              << targetName;
        }
      }else
      if(S_ISSOCK(entryInfo.st_mode))
      {
        cout << rd->d_name;
      }
      cout << endl;
    }
    //Проверка для предотвращения падения стека
    else
    {
      cout << rd->d_name << " " << strerror(errno) << endl;
      exit(1);
    }
  }
  closedir(dir);
}

#endif  /* _VIEW_H */
 
Здесь только файл с реализацией некоего класса.
Это все что у вас есть?
 
Здесь только файл с реализацией некоего класса.
Это все что у вас есть?

да, исходник нашел в каком-то блоге, с автором связи нет... но прога как раз подходит под мои требования...(выполняет, что нужно)
 
Это такой велосипедный вариант ls, если я верно понял.

Хорошо, будем работать с тем что есть.
Откуда программа должна брать путь?
 
Это такой велосипедный вариант ls, если я верно понял.

Хорошо, будем работать с тем что есть.
Откуда программа должна брать путь?

ну да вы верно поняли)
ну путь начало с /home/ (к примеру), а вообще его нужно задавать в терминале(консоли) к примеру ./имя_проги <путь>
 
Тогда смело меняйте строку
Код:
int myView(bool l,bool r,const char* path)
{
на
Код:
int main(int argc,char* argv[])
{
  const char* path=argv[0];
 
Тогда смело меняйте строку
Код:
int myView(bool l,bool r,const char* path)
{
на
Код:
int main(int argc,char* argv[])
{
  const char* path=argv[0];

это я конечно пробовал, но тут вот какое дело...
myView(l,r,pathName);

из-за того, что нет определения к l,r, myView прога не хочет компилица
 
Код:
int main(int argc,char* argv[])
{
  const char* path=argv[0];
меняем на
Код:
int main(int argc,char* argv[])
{
  const char* path=argv[0];
  bool r=false;
  bool l=false;
 
Код:
int main(int argc,char* argv[])
{
  const char* path=argv[0];
меняем на
Код:
int main(int argc,char* argv[])
{
  const char* path=argv[0];
  bool r=false;
  bool l=false;

сделал, больше r и l не требует, а что сделать с myView? вообще удалить?
 
Да, я же написал заменить.
 
Вот так? если да, то я не совсем тогда понял как она работает! она получается ничего не делает!
Код:
#ifndef _VIEW_H
#define  _VIEW_H

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <iostream>
#include <pwd.h>
#include <grp.h>
#include <errno.h>

using namespace std;

int main(int argc,char* argv[])
{
 // const char* path=argv[0];
  bool r=false;
  bool l=false;
  const char* path=argv[0];
  DIR* dir = opendir(path);
  if(!dir)
    return 1;

  struct dirent *rd;

  while((rd = readdir(dir)))
  {
    if(!strcmp(rd->d_name,".") || !strcmp(rd->d_name,".."))
    {
      continue;
    }
    struct stat entryInfo;
    char pathName[PATH_MAX+1];

    strncpy(pathName,path,PATH_MAX);
    strncat(pathName,"/",PATH_MAX);
    strncat(pathName,rd->d_name,PATH_MAX);

    if(!lstat(pathName,&entryInfo))
    {
      if(l)
      {
        switch(entryInfo.st_mode & S_IFMT)
        {
          case S_IFDIR:
          {
            cout << "d";
            break;
          }
          case S_IFIFO:
          {
            cout << "p";
            break;
          }
          case S_IFSOCK:
          {
            cout << "s";
            break;
          }
          case S_IFLNK:
          {
            cout << "l";
            break;
          }
          default:
            cout << "-";
        }

        //Владелец
        //read
        if(entryInfo.st_mode & S_IRUSR)
          cout << "r";
        else
          cout << "-";
        //write
        if(entryInfo.st_mode & S_IWUSR)
          cout << "w";
        else
          cout << "-";
        //execute
        if(entryInfo.st_mode & S_IXUSR)
          cout << "x";
        else
          cout << "-";

        //Группа
        //read
        if(entryInfo.st_mode & S_IRGRP)
          cout << "r";
        else
          cout << "-";
        //write
        if(entryInfo.st_mode & S_IWGRP)
          cout << "w";
        else
          cout << "-";
        //execute
        if(entryInfo.st_mode & S_IXGRP)
          cout << "x";
        else
          cout << "-";

        //Прочие
        //read
        if(entryInfo.st_mode & S_IROTH)
          cout << "r";
        else
          cout << "-";
        //write
        if(entryInfo.st_mode & S_IWOTH)
          cout << "w";
        else
          cout << "-";
        //execute
        if(entryInfo.st_mode & S_IXOTH)
          cout << "x";
        else
          cout << "-";

        cout << " ";
        struct passwd* pwd = getpwuid(getuid());
        struct group* grp = getgrgid(pwd->pw_gid);
        cout << " " << grp->gr_name << " " << pwd->pw_name << " ";
      }

      if(S_ISDIR(entryInfo.st_mode))
      {
        cout << rd->d_name << endl;
        if(r)
        {
     //  const char* path=argv[0];
        }
      }else
      if(S_ISREG(entryInfo.st_mode))
      {
        cout << rd->d_name;
      }else
      if(S_ISLNK(entryInfo.st_mode))
      {        
        char targetName[PATH_MAX+1];
        if(readlink(pathName,targetName,PATH_MAX))
        {
          cout << rd->d_name << " link: "
              << targetName;
        }
      }else
      if(S_ISSOCK(entryInfo.st_mode))
      {
        cout << rd->d_name;
      }
      cout << endl;
    }
    //Проверка для предотвращения падения стека
    else
    {
      cout << rd->d_name << " " << strerror(errno) << endl;
      exit(1);
    }
  }
  closedir(dir);
}

#endif  /* _VIEW_H */
 
Замените bool l=false; на bool l=true;
 
Поставьте после
Код:
strncat(pathName,rd->d_name,PATH_MAX);
Код:
cout<<pathName<<endl;
 
может прога сама по себе не рабочая? хотя программист уверял, что прога работает...
 
Куда же я смотрел...
Замените:
Код:
const char* path=argv[0];
на
Код:
const char* path=argv[1];
 
Назад
Сверху