Определения функций-членов класса в отдельных библиотеках и зависимости ссылок - PullRequest
0 голосов
/ 02 июня 2018

Учитывая класс C, определенный в Ch, и функции-члены от f1 до fn, и функцию-член g1.

f1..fn Определения находятся в f.cpp, в то время как g1 находится в g.cpp.

f.cpp связан с lib1.so, а g.cpp связан с lib2.so.

g.cpp зависит от Ch, а lib2.so - от lib1.so.Но lib1.so не зависит от lib2.so

Когда у меня есть исполняемый файл, который использует члены C, кроме g1 (), и я пытаюсь связать его только с lib1.so, связывание завершается неудачей с неразрешенными ссылками:

lib1.so: неразрешенная ссылка на C :: g1 () (которая определена в lib2.so)

Если код в исполняемом файле не использует непосредственно g1, должен ли ябыть в состоянии иметь ссылки независимо от lib2 полностью?

1 Ответ

0 голосов
/ 02 июня 2018

Я думаю, что вы сделали, вы поместили прототип g1 () в Ch, так что вы должны обеспечить реализацию для него, как уже прокомментировал @Yksisarvinen.

Что вы, вероятно, хотите сделать во второй библиотекесоздать Dh с помощью прототипа g1 () или, возможно, класса подкласса из Ch в Dh и поместить новую реализацию (из g1 ()) для вашего D :: f1 ()

Еще лучше использовать абстрактный класс для определения интерфейса и предоставления2 реализации.Быстрый пример того, что я бы сделал:

//iface.h
class iface
{
public:
    virtual void f1() = 0;
}
//serial.h & cpp
class serial: public iface
{ 
public:
    final void f1(); //serial implementation in .cpp
}

//para.h & .cpp
class para: public iface
{
public:
    final void f1(); //parallel implementation in .cpp
}
...