Компоновщик GCC: staticA не может видеть staticB при компоновке другой разделяемой библиотеки - PullRequest
0 голосов
/ 10 января 2012

GCC 4.4.3, Ubuntu.

3 проекта:

  • A (статическая библиотека) build OK
  • B (статическая библиотека) build OK
  • X (ошибка компоновщика общей библиотеки или приложения консоли)

Почему в этом случае не разрешается ссылка X?

X calls B;
B calls A; // WHY???? linker error in X: B has undefined reference to stuff in A

Этот случай работает:

X calls A; // this fact allows B access A
X calls B;
B calls A; // Now X linked just fine

Полный код:

//////////////////////////////
// StaticAAA.cpp
void FunctionAAA()
{
}

//////////////////////////////
// StaticBBB.cpp
void FunctionAAA();
void FunctionBBB()
{
    FunctionAAA();
}

//////////////////////////////
// App.cpp
void FunctionAAA();
void FunctionBBB();

int main()
{
#ifdef WHY_LINKER_ERROR_FIXED
    FunctionAAA();
#endif
    FunctionBBB();
    return 0;
}

1 Ответ

3 голосов
/ 10 января 2012

Порядок библиотек в командной строке gcc важен - вам нужно перечислить библиотеки в порядке зависимости. Если у вас есть циклические зависимости, вам может потребоваться перечислить хотя бы одну библиотеку дважды, чтобы удовлетворить это требование.

В вашем конкретном случае вы, вероятно, хотите что-то вроде:

$ g++ ... X.o -lB -lA ...
...