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

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

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2016, 01:23   #1
DemonSinusa
Пользователь
 
Регистрация: 20.06.2015
Сообщений: 10
Восклицание Виртуальные методы на Си, линкет ld

Приветствую господа программеры!
Что я делаю не так?
Может что подзабыл, но не собирается это дело почемуто...
Код Сишный

PHP код:
/*
 * File:   CatLogUtils.cc
 * Author: DemonSinusa
 *
 * Created on 4 марта 2016 г., 23:29
 */

#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>

#include "CatLogUtils.h"

TM *nmask;

TM *StubOnStart() {
    
memset(nmask0sizeof (TM));
    
nmask->catalog_mask = (char *) "*";
    
nmask->file_mask = (char *) "*.sh\\*.elf";
    return 
nmask;
}

void StubOnStop(TM *ff) {

}

int TestFunc(char *pathnameFMet *methodsTM *maskint deep) {
    
struct dirent *block NULL;
    
char *fullname NULL;
    
FILE *fh NULL;
    
int count = -1tcount 0;
    
int pathlen strlen(pathname);
    if (
deep >= 0) {
    
DIR *path opendir(pathname);
    if (
path) {
        
count++;
        
struct stat file_info;

        while ((
block readdir(path))) {
        
count++;
        
fullname = (char *) malloc(strlen(block->d_name) + pathlen sizeof (char));
        
strcpy(fullnamepathname);
        
strcpy(&fullname[pathlen 1], block->d_name);

        if (!
stat(fullname, &file_info)) {
            switch (
file_info.st_mode S_IFMT) {
            case 
S_IFBLK:
                
printf("\tblock device:%s\n"block->d_name);
                break;
            case 
S_IFCHR:
                
printf("\tcharacter device:%s\n"block->d_name);
                break;
            case 
S_IFDIR:
                
printf("\tdirectory:%s\n"block->d_name);
                if (
methods->OnChangeCatLog) {
                
methods->OnChangeCatLog((wchar_t *) fullname);
                }
                if ((
tcount TestFunc(fullnamemethodsmaskdeep 1)) > 0)count += tcount;
                break;
            case 
S_IFIFO:
                
printf("\tFIFO/pipe:%s\n"block->d_name);
                break;
            case 
S_IFLNK:
                
printf("\tsymlink:%s\n"block->d_name);
                break;
            case 
S_IFREG:
                
printf("\tregular file:%s\n"block->d_name);

                if (
methods->OnCurFileFound) {
                
fh fopen(fullname"rb");
                
methods->OnCurFileFound(fhfile_info.st_size1);
                
fclose(fh);
                } else 
printf("asdasdasdasdasdadsad");
                break;
            case 
S_IFSOCK:
                
printf("\tsocket:%s\n"block->d_name);
                break;
            default:
                
printf("\tunknown?:%s\n"block->d_name);
                break;
            }
        }

        
free(fullname);
        }

        
closedir(path);
        return 
count;
    } else return -
1;
    }
    return 
0;
}

void FindAnyRecursive(char *pathnameFMet *methodsint deep) {
    
int count = -1;
    
TM *mask NULL;
    if ((!
pathname) || (!methods))return;

    if (
methods)
    if (
methods->OnFoundStart)mask methods->OnFoundStart();
    else 
mask StubOnStart();

    
count TestFunc(pathnamemethodsmaskdeep);

    if (
methods)
    if (
methods->OnFoundStop)methods->OnFoundStop(mask);
    else 
StubOnStop(mask);


PHP код:

/*
 * File:   CatLogUtils.h
 * Author: DemonSinusa
 *
 * Created on 4 марта 2016 г., 23:29
 */

#ifndef CATLOGUTILS_H
#define CATLOGUTILS_H


typedef struct _type_mask_ {
    
struct timespec min_st_atim/* >?1:0 по чтению */
    
struct timespec min_st_mtim/* >?1:0 по записи  */
    
struct timespec min_st_ctim/* >?1:0 по изменению параметров  */
    
char *catalog_mask, *file_mask//Маски отдельно на каталоги и фэйлы \\-разделитель
    
char bit_attr;
TM;


typedef struct _found_met_ {
    
TM *(* OnFoundStart)();
    
int (* OnCurFileFound)(FILE *fhlong flenint type2pars);
    
void (* OnChangeCatLog)(wchar_t *newdir);
    
void (* OnFoundStop)(TM *);
FMet;

void FindAnyRecursive(char *pathnameFMet *methodsint deep);

#endif /* CATLOGUTILS_H */ 
Ну и призываю соответственно вот так:
PHP код:
#include <stdio.h>
#include <stdlib.h>

#include "CatLogUtils.h"


char *curdir NULL;

void OnChangeCatLog(wchar_t *newdir) {
    
curdir = (char *) newdir;
    
printf("Каталог сменился на:\n%s"newdir);
}

int OnCurFileFound(FILE *fhlong flenint type2pars) {
    switch (
type2pars) {
    default:
        
printf("Da, etogo netu");
        break;
    }
    return 
0;
}

/*
 *
 */
int main(int argcchar** argv) {

    
FMet funcs;
    
funcs.OnChangeCatLog OnChangeCatLog;
    
funcs.OnCurFileFound OnCurFileFound;

    
FindAnyRecursive("/", &funcs10);

    return (
EXIT_SUCCESS);

А линкер не собирает только не понимаю почему, помогите пошалуйста!

Цитата:
mkdir -p build/Debug/GNU-Linux
rm -f "build/Debug/GNU-Linux/CatLogUtils.o.d"
g++ -c -g -MMD -MP -MF "build/Debug/GNU-Linux/CatLogUtils.o.d" -o build/Debug/GNU-Linux/CatLogUtils.o CatLogUtils.cc
mkdir -p build/Debug/GNU-Linux
rm -f "build/Debug/GNU-Linux/main.o.d"
gcc -c -g -MMD -MP -MF "build/Debug/GNU-Linux/main.o.d" -o build/Debug/GNU-Linux/main.o main.c
mkdir -p dist/Debug/GNU-Linux
g++ -o dist/Debug/GNU-Linux/gavp build/Debug/GNU-Linux/CatLogUtils.o build/Debug/GNU-Linux/main.o -dynamic
build/Debug/GNU-Linux/main.o: In function `main':
/home/bl/NetBeansProjects/GAVP/main.c:57: undefined reference to `FindAnyRecursive'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
nbproject/Makefile-Debug.mk:63: ошибка выполнения рецепта для цели «dist/Debug/GNU-Linux/gavp»
make[2]: *** [dist/Debug/GNU-Linux/gavp] Ошибка 1
make[2]: выход из каталога «/home/bl/NetBeansProjects/GAVP»
nbproject/Makefile-Debug.mk:60: ошибка выполнения рецепта для цели «.build-conf»
make[1]: *** [.build-conf] Ошибка 2
make[1]: выход из каталога «/home/bl/NetBeansProjects/GAVP»
nbproject/Makefile-impl.mk:39: ошибка выполнения рецепта для цели «.build-impl»
make: *** [.build-impl] Ошибка 2

СОБРАТЬ FAILED (значение выхода 2,, общее время: 278ms)
DemonSinusa вне форума Ответить с цитированием
Старый 05.03.2016, 11:55   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Один файл .c другой .cc
Сделайте либо оба .c либо оба .cc
waleri вне форума Ответить с цитированием
Старый 05.03.2016, 16:08   #3
DemonSinusa
Пользователь
 
Регистрация: 20.06.2015
Сообщений: 10
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Один файл .c другой .cc
Сделайте либо оба .c либо оба .cc
А кому какая разница как куски кода именуются, там хоть *.zopa+*.hzopa рядом с *.голова+*.холова или вообще без расширения - на качество кода это не влияет
А в проблеме разобрался сам, как оказалось g++ и Сишные исходники компиляет... и линкует тоже g++ вместо привычных gcc для Си g++ для С++, ld для линковки...
Чертовщина какая-то...
Но исходя из кода я не выходил за пределы чистого Си сисинтаксиса.
DemonSinusa вне форума Ответить с цитированием
Старый 05.03.2016, 16:31   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

1.
Цитата:
А кому какая разница как куски кода именуются, там хоть *.zopa+*.hzopa рядом с *.голова+*.холова или вообще без расширения - на качество кода это не влияет
Показал свою тупость - молодец. А вообще обычно .с файлы компилируются как С код, а cpp или подобные - как С++. Если думаете, что разницы нет, то "учится, учится и учится"...

Цитата:
А в проблеме разобрался сам, как оказалось g++ и Сишные исходники компиляет... и линкует тоже g++ вместо привычных gcc для Си g++ для С++, ld для линковки...
Чертовщина какая-то...
Скажу по секрету gcc и линковать умеет... Вернее gcc просто по необходимости вызывает препроцессор, соответствующий компилятор и линкер, и даже strip

Цитата:
Но исходя из кода я не выходил за пределы чистого Си сисинтаксиса.
А еще есть компиляторы С и С++ функции называют поразному...
p51x вне форума Ответить с цитированием
Старый 05.03.2016, 17:23   #5
DemonSinusa
Пользователь
 
Регистрация: 20.06.2015
Сообщений: 10
Хорошо

Цитата:
Сообщение от p51x Посмотреть сообщение
1.
Показал свою тупость - молодец. А вообще обычно .с файлы компилируются как С код, а cpp или подобные - как С++. Если думаете, что разницы нет, то "учится, учится и учится"...
Не умничайте, ответ был не по теме. По вашему как это могло помочь касательно вопроса? -Никак. Вот и думайте кто тупость показывает.

Цитата:
Сообщение от p51x Посмотреть сообщение
Скажу по секрету gcc и линковать умеет... Вернее gcc просто по необходимости вызывает препроцессор, соответствующий компилятор и линкер, и даже strip
Это понятно, но для чего? Предположу, что делают из устойчивой взаимоотвязанной архитектуры компилеров Шиновсподобный монолит...

Цитата:
Сообщение от p51x Посмотреть сообщение
А еще есть компиляторы С и С++ функции называют поразному...
А это всем давно известно и еще в разных компилерах по разному пакуется первый метод класса, в некоторых достаточно по адресу класса вызвать... но не везде так

Вообщем тема закрыта, все слеплено.
DemonSinusa вне форума Ответить с цитированием
Старый 05.03.2016, 18:15   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Не умничайте, ответ был не по теме.
Мы здесь черные дыры обсуждали или все таки компиляуию ваших исходников? ТОгда все по теме.

Цитата:
По вашему как это могло помочь касательно вопроса? -Никак.
Ну вам веднее, тогда нафиг было вопрос задавать?

Цитата:
Вот и думайте кто тупость показывает.
Я свое мнение высказал, если вы не читаете, что вам пишут, то это ваши проблемы.
p51x вне форума Ответить с цитированием
Старый 05.03.2016, 19:13   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от DemonSinusa Посмотреть сообщение
Не умничайте, ответ был не по теме.
Ответ был по теме. То, что вы не знаете про name mangling - всецело ваши проблемы.
waleri вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
виртуальные методы CppForYou Помощь студентам 1 20.05.2014 10:13
виртуальные методы p789 C# (си шарп) 1 23.10.2012 10:36
Виртуальные методы peplenko C# (си шарп) 8 09.04.2011 04:40
Виртуальные методы Kn793 Общие вопросы C/C++ 5 26.06.2010 15:08
Полиморфизм и виртуальные методы Викдон Общие вопросы Delphi 1 02.02.2009 04:40