У меня проблема с глобальными переменными в проекте совместно используемой библиотеки c ++. Моя библиотека должна работать как стандартная общая библиотека g ++ (.so), а также как dll. я сделал это, создав файлы libiup_dll.cpp и libiup_dll.h, где у меня есть что-то вроде
#ifdef BUILD_DLL
// code for the dll: wrapper functions around the classes in my shared library
#endif
в моей DLL, мне нужны функции setloglevel (int) и geterrormsg (). во всех моих классах я бы добавил к глобальной переменной errormsg все сообщения об ошибках. эта переменная должна затем быть возвращена функцией geterrormsg (). я реализовал это с помощью
std::string errormsg;
int loglevel;
в libiup_dll.h (снаружи и #ifdefs, поэтому он должен быть доступен глобально), а затем поместите
extern std::string errormsg;
extern int loglevel;
в файлах моих классов .h (вне класса, вверху файлов)
теперь у меня две проблемы:
1) при компиляции программы командной строки с g ++, которая использует мою библиотеку, я получаю ошибки
Построение цели: libiup_test Вызов:
GCC C ++ Linker G ++
-L "/ home / hilboll / src / libiup / Release" -L / usr / local / lib -o "libiup_test" ./src/stratcalc/SimpleStratosphericColumnCalculatorTest.o
./src/interp/SimpleInterpolatorTest.o
./src/Test.o -lgsl -lhdf5 -lhdf5_cpp
-lblas -liup /home/hilboll/src/libiup/Release/libiup.so:
неопределенная ссылка на loglevel'
/home/hilboll/src/libiup/Release/libiup.so:
undefined reference to
errormsg '
collect2: ld вернул 1 статус выхода
make: *** [libiup_test] Ошибка 1
, хотя в моей программе командной строки нет никаких ссылок на errormsg или loglevel.
2) при попытке скомпилировать dll под windows с VS2008, я получаю
г: \ SRC \ против \ libiup_dll \ libiup_dll.h (229)
: ошибка C2086: 'std :: string errormsg':
Neudefinition
г: \ SRC \ libiup \ SRC \ stratcalc ../ интерполяция / SimpleInterpolator.h (16):
Siehe Deklaration von 'errormsg'
г: \ SRC \ против \ libiup_dll \ libiup_dll.h (234)
: ошибка C2086: 'int loglevel':
Neudefinition
г: \ SRC \ libiup \ SRC \ stratcalc ../ интерполяция / SimpleInterpolator.h (17):
Siehe Deklaration von 'loglevel'
Насколько я понимаю, это означает, что VS считает, что я определяю две переменные дважды. однако в SimpleInterpolator.h 16/17 есть только внешние объявления ...
кажется, я как-то еще не понял, как работают глобальные переменные. любая помощь с благодарностью!