• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Не Линкуется Программа. Жалуется Что Неразрешенный Внешний Символ &quo

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

WreWolf

Вот код класса
Если убрать нафиг все static то компилируется и работает, но мне нужно поле Log::szPath глобальным, чтоб при старте программы забить туда значение и забыть о нем
может вы подскажете косяк?

log.h
C++:
#include <iostream>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <time.h>

#include <Windows.h>

using namespace std;

class Log;

void tolog(char *log,int level);
void tolog(string log,int level);
char* get_time_string(int mode24);


log.cpp
C++:
#include "log.h"

class Log
{
static char *szPath;

inline string replace(string text, string s, string d)
{
for(unsigned index=0; index=text.find(s, index), index!=std::string::npos;)
{
text.replace(index, s.length(), d);
index+=d.length();
}
return text;
}	

static void tofile(char *log)
{
FILE * pFile;
pFile = fopen (szPath,"a");
if (pFile!=NULL) {
fputs (log,pFile);
fclose (pFile);
}
}


public:


void Init(char *path)
{
*szPath=*new char[255];
*szPath=*path;
return;
}

Log()
{

}

~Log()
{

}

static void loggin(char *log,int level)
{
char *rez=new char[sizeof(log)+100];
sprintf(rez,"%s %s\n",get_time_string(1),log);
switch( level)
{
case 1:
tofile(rez);
break;
case 2:
cout<<rez;
tofile(rez);
break;
case 3:
cout<<rez;
break;
}
delete rez;
}

};

//levels:
//			1-Error		//только в файл
//			2-Verbose	//в файл и на экран
//			3-Debug		//только на экран
void tolog(char *log,int level)
{
Log logs;
logs.loggin(log,level);
return;
}

void tolog(string log,int level)
{
char *FileExt = new char[log.size() + 1];
std::strcpy ( FileExt, log.c_str() );
delete FileExt;
Log logs;
logs.loggin(FileExt,level);
return;
}

char* get_time_string(int mode24)
{
static char time_str[12] = {0};  /* Stroes the time as a string */
struct tm *now = NULL;
int hour = 0;
time_t time_value = 0;

time_value = time(NULL);		 /* Get time value			 */
now = localtime(&time_value);	 /* Get time and date structure */
hour = now->tm_hour;			 /* Save the hour value		 */

sprintf(time_str,"%02d:%02d:%02d",hour,now->tm_min,now->tm_sec);
return time_str;
}
 
L

lazybiz

Какие ошибки выдает и как ты инициализируешь Log::szPath ?
 
W

WreWolf

инициализурую
C++:
Log logs;
logs.Init("C:\\root\\");

Проблема решилась
не хватало

C++:
char *Log::szLPath;

в log.cpp
было

C++:
#include "log.h"

стало

C++:
#include "log.h"
char *Log::szLPath;
 
L

lazybiz

А зачем тебе вызывать функцию logs.Init("C:\\root\\");, если char *Log::szLPath; у тебя глобальна?
Просто определи её и все:
C++:
char *Log::szLPath = "C:\\root\\";
Хотя я вообще не понимаю зачем ты ее глобальной делаешь, ты в курсе что переменная класса, объявленная как static является одной для всех классов (class Log в твоем случае).
 
W

WreWolf

в курсе. именно по этой причине и делаю ее статической
хотя уже решил сделать весь класс статическим и не плодить экземпляры в каждой функции которая хочет писать лог

А зачем тебе вызывать функцию logs.Init("C:\\root\\");, если char *Log::szLPath; у тебя глобальна?
по тому что инициализирую ил main, хотя на самом деле думаю она уже не нужна
 
L

lazybiz

решил сделать весь класс статическим и не плодить экземпляры в каждой функции которая хочет писать лог
Это ты о чем?

А смысла этого предложения я вообще не понял:
по тому что инициализирую ил main, хотя на самом деле думаю она уже не нужна
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!