Qt Проблемы компиляции с использованием переменной extern - PullRequest
0 голосов
/ 24 июня 2011

У меня довольно длинный процесс, который создает около 700 Мбайт выходного файла журнала txt.Это очень сложно управлять.Поэтому я хочу разделить вывод на несколько меньших файлов журнала.Вот как выглядит мой main.cpp

#include <QtGui/QApplication>
#include "mineedit.h"
#include "logoutput.h"
#include <iostream>

void messageHandling(QtMsgType type, const char *msg){

if (ERRORLOGGER.isEmpty()){
    ERRORLOGGER = DEFERRORLOGGER;
}

std::cout << "In Message Handling" << std::endl;
std::cout << "Writing to file" << ERRORLOGGER.toStdString() << std::endl;

QFile file(ERRORLOGGER);
file.open(QFile::Append);
QTextStream stream(&file);
switch (type) {
case QtDebugMsg:
    stream << msg << "\n";
    file.close();
    break;
case QtWarningMsg:
    stream << "WARNING: " << msg << "\n";
    file.close();
    break;
case QtCriticalMsg:
    stream << "CRITICAL: " << msg << "\n";
    file.close();
    break;
case QtFatalMsg:
    stream << "FATAL: " << msg << "\n";
    file.close();
    abort();
}    
}

int main(int argc, char *argv[])
 {
ERRORLOGGER = DEFERRORLOGGER;
qInstallMsgHandler(messageHandling);
QApplication a(argc, argv);
MineEdit w;
w.show();
return a.exec();
}
[/CODE]

А мой logoutput.h похож на

#ifndef LOGOUTPUT_H
#define LOGOUTPUT_H

#include <QString>

//----------------------------For outputting an error file------------------------------
#define         DEFERRORLOGGER             "/home/aarelovich/Documents/log.err"
#define         FOLDER_OUTPUT_LOG          "./home/aarelovich/Documents"
extern QString  ERRORLOGGER;

 #endif // LOGOUTPUT_H

Теперь в части моего кода я делаю: ERRORLOGGER = name_of_current_log_file.

Однако я получаю следующие ошибки компиляции: obj / main.o: В функции messageHandling(QtMsgType, char const*)': /home/aarelovich/Dropbox/MineSim/main.cpp:8: undefined reference to ERRORLOGGER '/home/aarelovich/Dropbox/MineSim/main.cpp:9: неопределенная ссылка на ERRORLOGGER' /home/aarelovich/Dropbox/MineSim/main.cpp:13: undefined reference to ERRORLOGGER' / home/aarelovich/Dropbox/MineSim/main.cpp:15: неопределенная ссылка на ERRORLOGGER' obj/main.o: In function main ': /home/aarelovich/Dropbox/MineSim/main.cpp:40: неопределенная ссылка на ERRORLOGGER' obj/mineedit.o:/home/aarelovich/Dropbox/MineSim/mineedit.cpp:101: more undefined references to ERRORLOGGER', следуя collect2: ld возвращено1 выход из состояния

Может кто-нибудь сказать, пожалуйста, что я делаю не так?Или как я могу динамически изменить выходной файл, в котором я создаю журнал приложения?

Спасибо за любую помощь

1 Ответ

4 голосов
/ 24 июня 2011

Ваша проблема, вероятно, связана с внешней переменной.

Здесь - пример использования ключевого слова extern в c ++.

Обратите внимание, что при связывании C ++ и C имеют различия с ключевым словом extern.

Основное, что вам нужно сделать, это

global.cpp:

// declaration of g_nValue
int g_nValue = 5;

main.cpp:

// extern tells the compiler this variable is declared elsewhere
    extern int g_nValue;

    int main()
    {
        g_nValue = 7;
        return 0;
    }

В вашем примере, если вы используете extern QString ERRORLOGGER; в logoutput.h , эта переменная должна быть объявлена ​​в другом cpp, как описано в ссылке.

Надеюсь, это поможет

...