Порядок, в котором связаны библиотеки, имеет значение, если библиотеки зависят друг от друга. В общем случае, если библиотека A
зависит от библиотеки B
, тогда libA
ДОЛЖЕН появляться перед libB
в флагах компоновщика.
Например:
// B.h
#ifndef B_H
#define B_H
struct B {
B(int);
int x;
};
#endif
// B.cpp
#include "B.h"
B::B(int xx) : x(xx) {}
// A.h
#include "B.h"
struct A {
A(int x);
B b;
};
// A.cpp
#include "A.h"
A::A(int x) : b(x) {}
// main.cpp
#include "A.h"
int main() {
A a(5);
return 0;
};
Создайте библиотеки:
$ g++ -c A.cpp
$ g++ -c B.cpp
$ ar rvs libA.a A.o
ar: creating libA.a
a - A.o
$ ar rvs libB.a B.o
ar: creating libB.a
a - B.o
Скомпилируйте:
$ g++ main.cpp -L. -lB -lA
./libA.a(A.o): In function `A::A(int)':
A.cpp:(.text+0x1c): undefined reference to `B::B(int)'
collect2: error: ld returned 1 exit status
$ g++ main.cpp -L. -lA -lB
$ ./a.out
Чтобы повторить снова, порядок имеет значение!
Мне кажется, проблема не в gson. Gson правильно отслеживает разницу между нулевой и пустой строкой. Вы уверены, что хотите стереть это различие? Вы уверены, что все классы, использующие TestObject, не заботятся?
Что вы могли бы сделать, если вам не нужна разница, это изменить пустые строки до нуля в TestObject до его сериализации. Или лучше, сделайте сеттеры в TestObject таким образом, чтобы пустая строка была равна нулю; таким образом вы строго определяете внутри класса, что пустая строка совпадает с нулевой. Вы должны убедиться, что значения не могут быть установлены за пределами сеттеров.