1
Programming / Duplicate symbol error
« on: October 01, 2023, 01:07:51 am »
So I tried to compile the latest smplayer, it went pretty well, a couple of minor fixes, until it got to screensaver.cpp where it tried to take the *nix path of disabling power savings.
Investigation showed that winscreensaver.cpp had the code to disable Doodles screensaver, so fixed screensaver.cpp/h by changing all the #ifdef Q_OS_WIN to #if defined (Q_OS_WIN) || defined (Q_OS_OS2), made sure that winscreensaver.cpp was compiled on OS/2 and screensaver.cpp compiled fine. Linking died with,
I don't understand where the duplicate symbol is coming from. The code,
screensaver.h
Winscreensaver.cpp is at https://github.com/smplayer-dev/smplayer/blob/master/src/winscreensaver.cpp change the .cpp to h for the header.
Ideas?
Investigation showed that winscreensaver.cpp had the code to disable Doodles screensaver, so fixed screensaver.cpp/h by changing all the #ifdef Q_OS_WIN to #if defined (Q_OS_WIN) || defined (Q_OS_OS2), made sure that winscreensaver.cpp was compiled on OS/2 and screensaver.cpp compiled fine. Linking died with,
Code: [Select]
weakld: K:\work\smplayer\build\screensaver.obj - error: Duplicate symbol '__ZN11ScreenSaverD2Ev' ('__ZN11ScreenSaverD2Ev').
weakld: K:\work\smplayer\build\screensaver.obj - error: Symbol previosly defined in this module.
weakld: info: fFlags new 0x0001 fFlags old 0x0001 (PUBLIC).
emxomfld: weak prelinker failed. (rc=-1)
make.exe: *** [Makefile:794: smplayer.exe] Error 1
K:\work\smplayer\build>c++filt __ZN11ScreenSaverD2Ev
ScreenSaver::~ScreenSaver()
I don't understand where the duplicate symbol is coming from. The code,
Code: [Select]
#include "screensaver.h"
#if defined (Q_OS_WIN) || defined (Q_OS_OS2)
#include "winscreensaver.h"
#endif
#ifdef OS_UNIX_NOT_MAC
#include "powersaving.h"
#endif
#ifdef Q_OS_MACX
#include "powersaving_mac.h"
#endif
ScreenSaver::ScreenSaver(QObject * parent) : QObject(parent) {
#if defined (Q_OS_WIN) || defined (Q_OS_OS2)
win_screensaver = new WinScreenSaver();
#else
power_saving = new PowerSaving(this);
#endif
}
ScreenSaver::~ScreenSaver() {
#if defined (Q_OS_WIN) || defined (Q_OS_OS2)
delete win_screensaver;
#endif
}
void ScreenSaver::enable() {
#if defined (Q_OS_WIN) || defined (Q_OS_OS2)
win_screensaver->enable();
#else
power_saving->uninhibit();
#endif
}
void ScreenSaver::disable() {
#if defined (Q_OS_WIN) || defined (Q_OS_OS2)
win_screensaver->disable();
#else
power_saving->inhibit();
#endif
}
#include "moc_screensaver.cpp"
screensaver.h
Code: [Select]
#ifndef SCREENSAVER_H
#define SCREENSAVER_H
#include <QObject>
class PowerSaving;
class WinScreenSaver;
class ScreenSaver : public QObject
{
Q_OBJECT
public:
ScreenSaver(QObject * parent = 0);
~ScreenSaver();
public slots:
void enable();
void disable();
protected:
#if defined (Q_OS_WIN) || defined (Q_OS_OS2)
WinScreenSaver * win_screensaver;
#else
PowerSaving * power_saving;
#endif
};
#endif
Winscreensaver.cpp is at https://github.com/smplayer-dev/smplayer/blob/master/src/winscreensaver.cpp change the .cpp to h for the header.
Ideas?