Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Digan от Июнь 03, 2011, 16:46



Название: multiple definition при сборке модифицированной библиотеки
Отправлено: Digan от Июнь 03, 2011, 16:46
Всем добрый день.

В общем понадобилось модифицировать одну библиотеку на си: добавить пару функций и пару переменных. И все это дело присоединить к Qt-приложению.
Немодифицированная библиотека собирается без проблем.
Модифицированная же при сборке выдает ошибку multiple definition of `имя моей новой переменной'.
Мои переменные и функции объявлены в си файлах следующим образом.
Код
C
  char *cfactor;
  char *getCF();
 
  char *resultString;
  char *getResultString();
 

Как это можно исправить?


Название: Re: multiple definition при сборке модифицированной библиотеки
Отправлено: GreatSnake от Июнь 03, 2011, 17:06
во включаемом файле пропиши видимость символов:
Код
C
extern char *cfactor;
extern char *resultString;
 


Название: Re: multiple definition при сборке модифицированной библиотеки
Отправлено: Digan от Июнь 03, 2011, 19:05
Если так объявить, то я не могу использовать эту переменную в моей функции.

К примеру в prntutil.h объявленно:
Код
C
  extern char *cfactor;
  char *getCF();
 

Тогда в prntutil.c пишу реализацию getCF():
Код
C
globle char *getCF()
{
   if(cfactor != NULL)
       return cfactor;
   else
       return "CF not have value\n";
}
 

При сборке получаю ошибки:
Цитировать
...\debug\prntutil.o:-1: In function `getCF':
...\prntutil.c:80: ошибка: undefined reference to `cfactor'
...\prntutil.c:81: ошибка: undefined reference to `cfactor'


Название: Re: multiple definition при сборке модифицированной библиотеки
Отправлено: GreatSnake от Июнь 03, 2011, 21:39
Мде, азы однако...

А кто память под cfactor выделять будет  ???

В prntutil.c заведи:
Код
C
char *cfactor;


Название: Re: multiple definition при сборке модифицированной библиотеки
Отправлено: Digan от Июнь 03, 2011, 22:23
Память выделять для cfactor не нужно в этом случае.
Т.к. указателю cfactor присваивается значение другого указателя, который находиться внутри одной из функций. То есть все это я делаю, чтобы "вытащить" из функции библиотеки некоторое значение, которое стандартными средствами библиотеки никак не получить.


Название: Re: multiple definition при сборке модифицированной библиотеки
Отправлено: LisandreL от Июнь 03, 2011, 22:59
Память выделять для cfactor не нужно в этом случае.
Имеется в виду, что объявить переменную вы должны в c (cpp) файле char *cfactor;, а в заголовочнике (h-файл) не создаёте переменную, а лишь делаете её видимой извне extern char *cfactor;, т.е. нужна и та и та строчка кода, каждая в своём файле.