Linux linker problems
-
wrote on 10 Dec 2024, 10:45 last edited by
When I rebuild my project this morning I got:
/usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `ImageLoader::ImageLoader()': /home/amonra/.vs/DSS/DeepSkyStacker/../DeepSkyStackerKernel/imageloader.h:66: undefined reference to `vtable for ImageLoader' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `ImageLoader::~ImageLoader()': /home/amonra/.vs/DSS/DeepSkyStacker/../DeepSkyStackerKernel/imageloader.h:67: undefined reference to `vtable for ImageLoader' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `QMetaObject::Connection QObject::connect<void (ImageLoader::*)(std::filesystem::__cxx11::path), void (DSS::StackingDlg::*)(std::filesystem::__cxx11::path)>(QtPrivate::FunctionPointer<void (ImageLoader::*)(std::filesystem::__cxx11::path)>::Object const*, void (ImageLoader::*)(std::filesystem::__cxx11::path), QtPrivate::ContextTypeForFunctor<void (DSS::StackingDlg::*)(std::filesystem::__cxx11::path), void>::ContextType const*, void (DSS::StackingDlg::*&&)(std::filesystem::__cxx11::path), Qt::ConnectionType)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:270: undefined reference to `ImageLoader::staticMetaObject' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `QMetaObject::Connection QObject::connect<void (ImageLoader::*)(), void (DSS::StackingDlg::*)()>(QtPrivate::FunctionPointer<void (ImageLoader::*)()>::Object const*, void (ImageLoader::*)(), QtPrivate::ContextTypeForFunctor<void (DSS::StackingDlg::*)(), void>::ContextType const*, void (DSS::StackingDlg::*&&)(), Qt::ConnectionType)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:270: undefined reference to `ImageLoader::staticMetaObject' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `DSS::ImageListModel const* qobject_cast<DSS::ImageListModel const*>(QObject const*)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:439: undefined reference to `DSS::ImageListModel::staticMetaObject' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(ImageListModel.cpp.o): in function `DSS::ImageListModel::ImageListModel(QObject*)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/ImageListModel.cpp:45: undefined reference to `vtable for DSS::ImageListModel' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(ImageListModel.cpp.o): in function `DSS::ImageListModel::tr(char const*, char const*, int)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/ImageListModel.h:43: undefined reference to `DSS::ImageListModel::staticMetaObject' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(imageloader.cpp.o): in function `ThreadLoader::ThreadLoader(std::filesystem::__cxx11::path const&, ImageLoader*)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.h:87: undefined reference to `vtable for ThreadLoader' /usr/bin/ld: /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.h:87: undefined reference to `vtable for ThreadLoader' collect2: error: ld returned 1 exit status
I don't know if there's a Qt issue here or not, but does anyone recognise this problem (I'm using g++13 right now).
-
When I rebuild my project this morning I got:
/usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `ImageLoader::ImageLoader()': /home/amonra/.vs/DSS/DeepSkyStacker/../DeepSkyStackerKernel/imageloader.h:66: undefined reference to `vtable for ImageLoader' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `ImageLoader::~ImageLoader()': /home/amonra/.vs/DSS/DeepSkyStacker/../DeepSkyStackerKernel/imageloader.h:67: undefined reference to `vtable for ImageLoader' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `QMetaObject::Connection QObject::connect<void (ImageLoader::*)(std::filesystem::__cxx11::path), void (DSS::StackingDlg::*)(std::filesystem::__cxx11::path)>(QtPrivate::FunctionPointer<void (ImageLoader::*)(std::filesystem::__cxx11::path)>::Object const*, void (ImageLoader::*)(std::filesystem::__cxx11::path), QtPrivate::ContextTypeForFunctor<void (DSS::StackingDlg::*)(std::filesystem::__cxx11::path), void>::ContextType const*, void (DSS::StackingDlg::*&&)(std::filesystem::__cxx11::path), Qt::ConnectionType)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:270: undefined reference to `ImageLoader::staticMetaObject' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `QMetaObject::Connection QObject::connect<void (ImageLoader::*)(), void (DSS::StackingDlg::*)()>(QtPrivate::FunctionPointer<void (ImageLoader::*)()>::Object const*, void (ImageLoader::*)(), QtPrivate::ContextTypeForFunctor<void (DSS::StackingDlg::*)(), void>::ContextType const*, void (DSS::StackingDlg::*&&)(), Qt::ConnectionType)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:270: undefined reference to `ImageLoader::staticMetaObject' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `DSS::ImageListModel const* qobject_cast<DSS::ImageListModel const*>(QObject const*)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:439: undefined reference to `DSS::ImageListModel::staticMetaObject' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(ImageListModel.cpp.o): in function `DSS::ImageListModel::ImageListModel(QObject*)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/ImageListModel.cpp:45: undefined reference to `vtable for DSS::ImageListModel' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(ImageListModel.cpp.o): in function `DSS::ImageListModel::tr(char const*, char const*, int)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/ImageListModel.h:43: undefined reference to `DSS::ImageListModel::staticMetaObject' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(imageloader.cpp.o): in function `ThreadLoader::ThreadLoader(std::filesystem::__cxx11::path const&, ImageLoader*)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.h:87: undefined reference to `vtable for ThreadLoader' /usr/bin/ld: /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.h:87: undefined reference to `vtable for ThreadLoader' collect2: error: ld returned 1 exit status
I don't know if there's a Qt issue here or not, but does anyone recognise this problem (I'm using g++13 right now).
-
wrote on 10 Dec 2024, 11:36 last edited by Perdrix 12 Oct 2024, 11:56
The ImageLoader class ctor and dtor were declared "= default"
I changed that to simply declare in the header and actually created function bodies for them in the cpp file, but still getting complaints:
/usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `QMetaObject::Connection QObject::connect<void (ImageLoader::*)(std::filesystem::__cxx11::path), void (DSS::StackingDlg::*)(std::filesystem::__cxx11::path)>(QtPrivate::FunctionPointer<void (ImageLoader::*)(std::filesystem::__cxx11::path)>::Object const*, void (ImageLoader::*)(std::filesystem::__cxx11::path), QtPrivate::ContextTypeForFunctor<void (DSS::StackingDlg::*)(std::filesystem::__cxx11::path), void>::ContextType const*, void (DSS::StackingDlg::*&&)(std::filesystem::__cxx11::path), Qt::ConnectionType)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:270: undefined reference to `ImageLoader::staticMetaObject' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `QMetaObject::Connection QObject::connect<void (ImageLoader::*)(), void (DSS::StackingDlg::*)()>(QtPrivate::FunctionPointer<void (ImageLoader::*)()>::Object const*, void (ImageLoader::*)(), QtPrivate::ContextTypeForFunctor<void (DSS::StackingDlg::*)(), void>::ContextType const*, void (DSS::StackingDlg::*&&)(), Qt::ConnectionType)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:270: undefined reference to `ImageLoader::staticMetaObject' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `DSS::ImageListModel const* qobject_cast<DSS::ImageListModel const*>(QObject const*)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:439: undefined reference to `DSS::ImageListModel::staticMetaObject' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(ImageListModel.cpp.o): in function `DSS::ImageListModel::ImageListModel(QObject*)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/ImageListModel.cpp:45: undefined reference to `vtable for DSS::ImageListModel' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(ImageListModel.cpp.o): in function `DSS::ImageListModel::tr(char const*, char const*, int)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/ImageListModel.h:43: undefined reference to `DSS::ImageListModel::staticMetaObject' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(imageloader.cpp.o): in function `ImageLoader::ImageLoader()': /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.cpp:30: undefined reference to `vtable for ImageLoader' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(imageloader.cpp.o): in function `ImageLoader::~ImageLoader()': /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.cpp:32: undefined reference to `vtable for ImageLoader' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(imageloader.cpp.o): in function `ThreadLoader::ThreadLoader(std::filesystem::__cxx11::path const&, ImageLoader*)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.h:87: undefined reference to `vtable for ThreadLoader' /usr/bin/ld: /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.h:87: undefined reference to `vtable for ThreadLoader'
-
The ImageLoader class ctor and dtor were declared "= default"
I changed that to simply declare in the header and actually created function bodies for them in the cpp file, but still getting complaints:
/usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `QMetaObject::Connection QObject::connect<void (ImageLoader::*)(std::filesystem::__cxx11::path), void (DSS::StackingDlg::*)(std::filesystem::__cxx11::path)>(QtPrivate::FunctionPointer<void (ImageLoader::*)(std::filesystem::__cxx11::path)>::Object const*, void (ImageLoader::*)(std::filesystem::__cxx11::path), QtPrivate::ContextTypeForFunctor<void (DSS::StackingDlg::*)(std::filesystem::__cxx11::path), void>::ContextType const*, void (DSS::StackingDlg::*&&)(std::filesystem::__cxx11::path), Qt::ConnectionType)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:270: undefined reference to `ImageLoader::staticMetaObject' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `QMetaObject::Connection QObject::connect<void (ImageLoader::*)(), void (DSS::StackingDlg::*)()>(QtPrivate::FunctionPointer<void (ImageLoader::*)()>::Object const*, void (ImageLoader::*)(), QtPrivate::ContextTypeForFunctor<void (DSS::StackingDlg::*)(), void>::ContextType const*, void (DSS::StackingDlg::*&&)(), Qt::ConnectionType)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:270: undefined reference to `ImageLoader::staticMetaObject' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `DSS::ImageListModel const* qobject_cast<DSS::ImageListModel const*>(QObject const*)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:439: undefined reference to `DSS::ImageListModel::staticMetaObject' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(ImageListModel.cpp.o): in function `DSS::ImageListModel::ImageListModel(QObject*)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/ImageListModel.cpp:45: undefined reference to `vtable for DSS::ImageListModel' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(ImageListModel.cpp.o): in function `DSS::ImageListModel::tr(char const*, char const*, int)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/ImageListModel.h:43: undefined reference to `DSS::ImageListModel::staticMetaObject' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(imageloader.cpp.o): in function `ImageLoader::ImageLoader()': /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.cpp:30: undefined reference to `vtable for ImageLoader' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(imageloader.cpp.o): in function `ImageLoader::~ImageLoader()': /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.cpp:32: undefined reference to `vtable for ImageLoader' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(imageloader.cpp.o): in function `ThreadLoader::ThreadLoader(std::filesystem::__cxx11::path const&, ImageLoader*)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.h:87: undefined reference to `vtable for ThreadLoader' /usr/bin/ld: /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.h:87: undefined reference to `vtable for ThreadLoader'
-
When I rebuild my project this morning I got:
/usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `ImageLoader::ImageLoader()': /home/amonra/.vs/DSS/DeepSkyStacker/../DeepSkyStackerKernel/imageloader.h:66: undefined reference to `vtable for ImageLoader' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `ImageLoader::~ImageLoader()': /home/amonra/.vs/DSS/DeepSkyStacker/../DeepSkyStackerKernel/imageloader.h:67: undefined reference to `vtable for ImageLoader' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `QMetaObject::Connection QObject::connect<void (ImageLoader::*)(std::filesystem::__cxx11::path), void (DSS::StackingDlg::*)(std::filesystem::__cxx11::path)>(QtPrivate::FunctionPointer<void (ImageLoader::*)(std::filesystem::__cxx11::path)>::Object const*, void (ImageLoader::*)(std::filesystem::__cxx11::path), QtPrivate::ContextTypeForFunctor<void (DSS::StackingDlg::*)(std::filesystem::__cxx11::path), void>::ContextType const*, void (DSS::StackingDlg::*&&)(std::filesystem::__cxx11::path), Qt::ConnectionType)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:270: undefined reference to `ImageLoader::staticMetaObject' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `QMetaObject::Connection QObject::connect<void (ImageLoader::*)(), void (DSS::StackingDlg::*)()>(QtPrivate::FunctionPointer<void (ImageLoader::*)()>::Object const*, void (ImageLoader::*)(), QtPrivate::ContextTypeForFunctor<void (DSS::StackingDlg::*)(), void>::ContextType const*, void (DSS::StackingDlg::*&&)(), Qt::ConnectionType)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:270: undefined reference to `ImageLoader::staticMetaObject' /usr/bin/ld: DeepSkyStacker/CMakeFiles/DeepSkyStacker.dir/StackingDlg.cpp.o: in function `DSS::ImageListModel const* qobject_cast<DSS::ImageListModel const*>(QObject const*)': /opt/Qt/6.8.0/gcc_64/include/QtCore/qobject.h:439: undefined reference to `DSS::ImageListModel::staticMetaObject' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(ImageListModel.cpp.o): in function `DSS::ImageListModel::ImageListModel(QObject*)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/ImageListModel.cpp:45: undefined reference to `vtable for DSS::ImageListModel' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(ImageListModel.cpp.o): in function `DSS::ImageListModel::tr(char const*, char const*, int)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/ImageListModel.h:43: undefined reference to `DSS::ImageListModel::staticMetaObject' /usr/bin/ld: DeepSkyStackerKernel/libDeepSkyStackerKernel.a(imageloader.cpp.o): in function `ThreadLoader::ThreadLoader(std::filesystem::__cxx11::path const&, ImageLoader*)': /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.h:87: undefined reference to `vtable for ThreadLoader' /usr/bin/ld: /home/amonra/.vs/DSS/DeepSkyStackerKernel/imageloader.h:87: undefined reference to `vtable for ThreadLoader' collect2: error: ld returned 1 exit status
I don't know if there's a Qt issue here or not, but does anyone recognise this problem (I'm using g++13 right now).
wrote on 10 Dec 2024, 12:17 last edited byThis post is deleted! -
wrote on 10 Dec 2024, 12:40 last edited by Perdrix 12 Oct 2024, 12:45
Well yes, of course I will - I only just saw the questions
class ImageLoader : public QObject { using CacheKeyType = std::filesystem::path; using CacheValueType = std::tuple<LoadedImage, int, bool>; // <image, lastUse, currentlyLoading> using CacheType = std::unordered_map<CacheKeyType, CacheValueType>; friend class ThreadLoader; Q_OBJECT
Yes, it generates signals.
Yes, I did a clean build
class ImageListModel : public QAbstractTableModel { Q_OBJECT
It also emits signals
-
Well yes, of course I will - I only just saw the questions
class ImageLoader : public QObject { using CacheKeyType = std::filesystem::path; using CacheValueType = std::tuple<LoadedImage, int, bool>; // <image, lastUse, currentlyLoading> using CacheType = std::unordered_map<CacheKeyType, CacheValueType>; friend class ThreadLoader; Q_OBJECT
Yes, it generates signals.
Yes, I did a clean build
class ImageListModel : public QAbstractTableModel { Q_OBJECT
It also emits signals
This post is deleted! -
wrote on 10 Dec 2024, 13:35 last edited by Perdrix 12 Oct 2024, 13:37
Hmmm....
Looking at the static library that contains the object files for both those classes showed no sign of moc generated stuff!
I added set(CMAKE_AUTOMOC TRUE) at the top of the CMakeLists.txt file for the library and it worked. I'm a bit surprised that this isn't the default for qt_add_library
I also moved the Q_OBJECT macro (which didn't fix the problem) ...
David
-
wrote on 10 Dec 2024, 14:42 last edited by JoeCFD 12 Oct 2024, 14:43
My code is as the follows and works.
class ImageLoader : public QObject { Q_OBJECT friend class ThreadLoader;
It is the key to delete everything in the build dir and run cmake .. again. make clean is not enough.
1/9