Я пытаюсь перенести некоторый код на C++, который я изначально написал на Mac llvm для Windows Cygwin gcc. В этом проекте, я статический связывание еха с двумя библиотеками (я использую CMake):Перекрестные зависимости библиотеки C++ - портирование с llvm на gcc
add_executable(myexe main.cc)
target_link_libraries(myexe lib1 lib2)
В lib1
есть класс, который объявляет виртуальный метод:
lib1/Class1.h:
class Class1
{
public:
void method1();
virtual void method2();
};
lib1/Class1.cpp:
#include "Class1.h"
void Class1::method1() {
// do work
}
// Note that method2 is not defined!
Class1::method2
не вызывается из lib1
, так что это отлично работает.
Class1::method2
определяется в lib2
:
lib2/Class2.h:
#include "Class1.h"
class Class2
{
private:
Class1 c1;
public:
void call_c1();
};
in lib2/Class2.cpp:
#include "Class2.h"
void Class1::method2() {
// do some other work
}
void Class2::call_c1() {
c1.method2();
}
Все это прекрасно работает, когда я компилирую и связать его с LLVM под MacOS. Когда я пытаюсь построить это с помощью gcc на Windows/Cygwin, я сталкиваюсь с различными ошибками компоновщика, например undefined reference to vtable
или undefined reference to 'Class1:method2'
. Фактическая ошибка зависит от упорядочения libs в вызове target_link_libraries
.
Есть ли какие-либо параметры командной строки, которые я мог бы передать gcc/cmake, чтобы заставить это работать? Или, может быть, лучше рассмотреть другую инструментальную цепочку в Windows? Сейчас я использую IntelliJ CLion на обеих платформах.
Заранее за вашу помощь.
Ваш пример отлично работает на моей установке cygwin, либо ваш файл cmake неверен, либо ваш пример не соответствует вашему примеру. Пожалуйста, проверьте пример, который вы опубликовали на вашем компьютере. также разместите свой файл cmake. упоминание вашей версии g ++ может помочь. – tejas
Я не знаю, в какой компиляционной единице выделяется vtbl, но это может быть разным между clang и gcc. Возможно, gcc создает ситуацию, когда обе библиотеки зависят друг от друга. Связывание (по крайней мере, с GNU ld) однопроходное слева направо, поэтому вам нужно поставить зависимые библиотеки до предоставления, и вам, возможно, придется указывать libs несколько раз, например '-llib1 -llib2 -llib1', если ссылка lib2 представляет новая зависимость от lib1. –
@ roland-w, большое спасибо за ваш комментарий. Вы предлагаете указывать libs несколько раз в 'target_link_libraries()' в cmake, действительно решила проблему. Если вы передадите свой комментарий в ответ, я буду отмечать его как правильно. –