How do I create an instance of an object in the constructor for a window? I am generating three errors just by declaring a pointer, named objects, in 'window.h' and instantiating it in 'window.cpp:' 'Window::Window(...){...objects = new objectHandler(1)}'
window.obj:-1: error: LNK2019: unresolved external symbol "public: __thiscall objectHandler::objectHandler(int)" (??0objectHandler##QAE#H#Z) referenced in function "public: __thiscall Window::Window(class QWidget *)" (??0Window##QAE#PAVQWidget###Z)
(file not found)
window.obj:-1: error: LNK2019: unresolved external symbol "public: __thiscall objectHandler::~objectHandler(void)" (??1objectHandler##QAE#XZ) referenced in function "public: void * __thiscall objectHandler::`scalar deleting destructor'(unsigned int)" (??_GobjectHandler##QAEPAXI#Z)
(file not found)
debug\Phursik.exe:-1: error: LNK1120: 2 unresolved externals
I looked up the errors and apparently they have to do with the functions being declared but not defined by the class. I am sure; however, that all functions declared in 'objectHandler.h' are defined in 'objectHandler.cpp' and Qt Creator even knows how to find one from the other. I am quite perplexed so thank you for your help in advance.
From window.cpp
Window::Window(QWidget *parent) :
QWidget(parent),
ui(new Ui::Window)
{
...
objects = new objectHandler(STEP_TIME_HOURS);
ui->setupUi(this);
}
From window.h
namespace Ui {
class Window;
}
class Window : public QWidget
{
Q_OBJECT
public:
explicit Window(QWidget *parent = 0);
~Window();
...
From objecthandler.cpp
objectHandler::objectHandler(int stepTimeHours)
{
this->stepTimeHours = stepTimeHours;
head = nullptr;
current = nullptr;
tail = nullptr;
}
objectHandler::~objectHandler()
{
current = head;
if (current->next)
{
current = current->next;
delete current->last;
}
else if (current)
delete current;
}...
From objecthandler.h
class objectHandler
{
public:
objectHandler(int stepTimeHours);
~objectHandler();
...
largeBody *head, *current, *tail;
}
I solved it. The issue below is similar except QT Creator automagically added my '.h' files to the list in the .pro file. I just needed to delete the build folder and suddenly everything started working.
Why doesn't Qt Creator find included headers in included paths - even though qmake is able to find them
Related
I'm working on a project where I'm using Bullet3 to add a Physics Simulation Component-System to EntityX.
I'm getting link errors when compiling code, and I can't quite figure out why. Both my header PhysicsSystem.h and the source PhysicsSystem.cpp are in the project, and I can see them both being linked as a .obj in the intermediate files.
The header file PhysicsSystem.h:
class PhysicsSystem : public entityx::System<PhysicsSystem>, public entityx::Receiver<PhysicsSystem> {
public:
void configure(entityx::EntityManager &entities, entityx::EventManager &events) override;
void update(entityx::EntityManager& entities, entityx::EventManager& events, entityx::TimeDelta dt) override;
void receive(const entityx::ComponentAddedEvent<RigidBody>& event);
void setGravity(ci::vec3 gravity);
btDiscreteDynamicsWorld* getWorld();
private:
btDefaultCollisionConfiguration* mCollisionConfiguration;
btCollisionDispatcher* mDispatcher;
btBroadphaseInterface* mOverlappingPairCache;
btSequentialImpulseConstraintSolver* mBulletSolver;
btDiscreteDynamicsWorld* mDynamicsWorld;
};
and PhysicsSystem.cpp:
void PhysicsSystem::configure(entityx::EntityManager &entities, entityx::EventManager &events) {
///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration.
mCollisionConfiguration = new btDefaultCollisionConfiguration();
///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded)
mDispatcher = new btCollisionDispatcher(mCollisionConfiguration);
///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep.
mOverlappingPairCache = new btDbvtBroadphase();
///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded)
mBulletSolver = new btSequentialImpulseConstraintSolver();
mDynamicsWorld = new btDiscreteDynamicsWorld(mDispatcher, mOverlappingPairCache, mBulletSolver, mCollisionConfiguration);
mDynamicsWorld->setGravity(btVector3(0.0, 0.0, 0.0));
events.subscribe<entityx::ComponentAddedEvent<RigidBody>>(*this);
}
void PhysicsSystem::update(entityx::EntityManager& entities, entityx::EventManager& events, entityx::TimeDelta dt) {
mDynamicsWorld->stepSimulation(static_cast<float>(dt), 10);
}
void PhysicsSystem::receive(const entityx::ComponentAddedEvent<RigidBody>& event) {
mDynamicsWorld->addRigidBody(event.component->getRigidBody());
}
void PhysicsSystem::setGravity(ci::vec3 gravity) {
if (mDynamicsWorld != nullptr) {
mDynamicsWorld->setGravity(btVector3(gravity.x, gravity.y, gravity.z));
}
else {
std::printf("PhysicsSystem ERROR -- must configure() system before you can set parameters.\n");
}
}
btDiscreteDynamicsWorld* PhysicsSystem::getWorld() {
return mDynamicsWorld;
}
When I try to compile I get the errors:
Error LNK2001 unresolved external symbol "public: virtual void __cdecl PhysicsSystem::configure(class entityx::EntityManager &,class entityx::EventManager &)" (?configure#PhysicsSystem#ecs#sitara##UEAAXAEAVEntityManager#entityx##AEAVEventManager#5##Z) PhysicsSystemExample C:\Project\physics\examples\PhysicsSystemExample\vc2013\PhysicsSystemExampleApp.obj 1
Error LNK2001 unresolved external symbol "public: virtual void __cdecl PhysicsSystem::update(class entityx::EntityManager &,class entityx::EventManager &,double)" (?update#PhysicsSystem#ecs#sitara##UEAAXAEAVEntityManager#entityx##AEAVEventManager#5#N#Z) PhysicsSystemExample C:\Project\physics\examples\PhysicsSystemExample\vc2013\PhysicsSystemExampleApp.obj 1
Error LNK2019 unresolved external symbol "public: void __cdecl PhysicsSystem::setGravity(struct glm::tvec3<float,0>)" (?setGravity#PhysicsSystem#ecs#sitara##QEAAXU?$tvec3#M$0A##glm###Z) referenced in function "public: virtual void __cdecl PhysicsSystemExampleApp::setup(void)" (?setup#PhysicsSystemExampleApp##UEAAXXZ) PhysicsSystemExample C:\Project\physics\examples\PhysicsSystemExample\vc2013\PhysicsSystemExampleApp.obj 1
Relatedly, I get a link warning 4042:
Severity Code Description Project File Line Suppression State
Warning LNK4042 object specified more than once; extras ignored PhysicsSystemExample C:\Project\physics\examples\PhysicsSystemExample\vc2013\build\x64\Debug\intermediate\PhysicsSystem.obj 1
But I only have the file added once, and can't find the file specified a second time. Why would the file be specified more than once?
What other steps can I take to troubleshoot why I'm having a linkage problem?
All I have is a main.cpp:
#include "myclass.h"
#include <QApplication>
#include <QTextEdit>
#include <QtGui>
class Notepad : public QWidget {
Q_OBJECT
public:
Notepad();
private slots:
void quit();
private:
QTextEdit *textEdit;
QPushButton *quitButton;
};
Notepad::Notepad()
{
textEdit = new QTextEdit();
quitButton = new QPushButton(tr("Quit"));
connect(quitButton, SIGNAL(clicked()), this, SLOT(quit()));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(textEdit);
layout->addWidget(quitButton);
setLayout(layout);
setWindowTitle(tr("Notepad"));
}
void Notepad::quit()
{
QMessageBox messageBox;
messageBox.setWindowTitle(tr("Notepad"));
messageBox.setText(tr("Do you really want to quit?"));
messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
messageBox.setDefaultButton(QMessageBox::No);
if(messageBox.exec() == QMessageBox::Yes)
qApp->quit();
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
return app.exec();
}
Error info:
1>main.obj : error LNK2001: Unresolvable external symbol "public: virtual struct QMetaObject const * __thiscall Notepad::metaObject(void)const " (?metaObject#Notepad##UBEPBUQMetaObject##XZ)
1>main.obj : error LNK2001: Unresolvable external symbol "public: virtual void * __thiscall Notepad::qt_metacast(char const *)" (?qt_metacast#Notepad##UAEPAXPBD#Z)
1>main.obj : error LNK2001: Unresolvable external symbol "public: virtual int __thiscall Notepad::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall#Notepad##UAEHW4Call#QMetaObject##HPAPAX#Z)
1>main.obj : error LNK2001: Unresolvable external symbol "public: static struct QMetaObject const Notepad::staticMetaObject" (?staticMetaObject#Notepad##2UQMetaObject##B)
I'm new to VS and Qt, Hope to find a solution to this, thanks.
The problem is likely that you have Q_OBJECT in your cpp file
class Notepad : public QWidget {
Q_OBJECT
To make it work you need to manually add moc step for your cpp to compilation process. Or move it to the header file, where it's done automatically
You use Q_OBJECT in your Notepad class, so you should moc it, compile the moc output and link with resulting .obj file.
Usually, classes are defined in header files, so you just run moc on the Notepad.h, make it generate moc_Notepad.cpp and compile the latter. In your case you should run moc on your main.cpp, generate something like main.moc and at the bottom of main.cpp add #include "main.moc".
I found my solution for this (FINALLY!) and thought I'd post it here.
I found this page: http://msdn.microsoft.com/en-us/library/aa267384%28v=vs.60%29.aspx
I'll paste the key piece here incase it disappears:
To use this run-time library
Single-threaded (libc.lib)
Multithreaded (libcmt.lib)
Multithreaded using DLL (msvcrt.lib)
Debug Single-threaded (libcd.lib)
Debug Multithreaded (libcmtd.lib)
Debug Multithreaded using DLL (msvcrtd.lib)
What this tells you is the runtile library you need, and which ones you don't.
So when I set release mode, Multi-threaded DLL (/MD), it didn't work for me, the issue was it had in the linker (under Input) the wrong values for the /NODEFAULTLIB, it had 3 entries, one of them being the one I was trying to use the msvcrt.lib. As soon as I changed it to: (leaving all the other values that weren't NODEFAULTLIB items)
/NODEFAULTLIB:libc.lib
/NODEFAULTLIB:libcmt.lib
/NODEFAULTLIB:libcd.lib
/NODEFAULTLIB:libcmtd.lib
/NODEFAULTLIB:msvcrtd.lib
(notice the absence of the one I'm interested it the non debug multithreaded dll lib msvcrt.lib)
It worked 110%!!!
Please like if you find useful, stack wasn't letting me post for a bit, hopefully it will let me post this one.
I have a Qt application with multiple classes that use signals and slots and it compiles just fine. However, when I make a custom class inside the main CPP (main.cpp) file, I get a linker error.
Here is the code I use:
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value)
{
if(value!=m_value)
{
m_value = value;
qDebug() << "Value " << value;
emit valueChanged(value);
}
}
signals:
void valueChanged(int newValue);
private:
int m_value;
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
a.setValue(12); // a.value() == 12, b.value() == 12
b.setValue(48); // a.value() == 12, b.value() == 48
QTimer::singleShot(0, &app, SLOT(quit()));
return app.exec();
}
Here are the errors:
Error 4 error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Counter::metaObject(void)const " (?metaObject#Counter##UBEPBUQMetaObject##XZ)
Error 5 error LNK2001: unresolved external symbol "public: virtual void * __thiscall Counter::qt_metacast(char const *)" (?qt_metacast#Counter##UAEPAXPBD#Z)
Error 6 error LNK2001: unresolved external symbol "public: virtual int __thiscall Counter::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall#Counter##UAEHW4Call#QMetaObject##HPAPAX#Z)
Error 7 error LNK2019: unresolved external symbol "protected: void __thiscall Counter::valueChanged(int)" (?valueChanged#Counter##IAEXH#Z) referenced in function "public: void __thiscall Counter::setValue(int)" (?setValue#Counter##QAEXH#Z)
This linker error does not occur when I place the counter in a separate header file. What's the reason for this behavior?
I'm assuming you're working with qmake.
The moc is made to run on header files automatically by default, because that's where classes are declared in general. Notice that this rule is defined in the makefile, you can manually run moc on a source file.
You have to inform qmake that the file contains a class. To do this, put #include "filename.moc" after the declaration of Counter. You can see more details here (QtCentre) or here (doc).
If you're working with another tool than qmake, say CMake, you have to specify a rule to force the moc to parse the .cpp files (the simplest is to process them all). For files that do not contain a Qt object class, moc will generate an empty file.
However, even if this class is made to be 'private', I advise you to declare it in a header (for example counter_private.h). For example, Qt source is using this trick.
It looks like you have only one code file. If you use the default way to create a Qt project build (qmake && make or QtCreator), the MOC only scans *.h files. If you have all your code in one main.cpp the MOC will not create any code, but that's needed for Signal/Slots to work.
The simplest way to make this specific example working would be adding a line "#include "main.moc"" at the end of your main.cpp. This dependency will be detected by qmake and the needed Makefile targets will be created.
The cutest way would be the clean one: One class - One header and one implementation file.
They moc/uic custom build commands are done on the header file, so it compiles when put in a seperate header/source file and not when put in the same source file
Basically I am following the basic example here. My .pro file contains QT += core network qtestlib. [Solved] testlib instead of typo qtestlib
When I include QVERIFY, It get the following linker error:
testwaypointlist.obj:-1: error: LNK2019: unresolved external symbol "bool __cdecl
QTest::qVerify(bool,char const *,char const *,char const *,int)"
(?qVerify#QTest##YA_N_NPBD11H#Z) referenced in function "private: void __thiscall
TestWaypointList::fillWaypoints(void)" (?fillWaypoints#TestWaypointList##AAEXXZ)
What files do I miss to link? Without QVERIFY the linker error disappears.
Header file:
#include <QObject>
#include <QtTest/QtTest>
#include "waypointlist.h"
//
// Testing the waypoint list
//
class TestWaypointList : public QObject
{
Q_OBJECT
private:
WaypointList _waypointList;
public:
explicit TestWaypointList(QObject *parent = 0);
private slots:
void fillWaypoints();
};
cpp:
//
// Fill the waypoint list
//
void TestWaypointList::fillWaypoints()
{
_waypointList = WaypointList();
.....
for (int i=0; i < TESTWPLISTCOUNT; i++) {
.....
TestWaypointList::_waypointList.updateOrAppend(id, timeframe);
}
QVERIFY(TestWaypointList::_waypointList.count() == 1); // causing the linker error
}
In your .pro file, you need to change QT += qtestlib to QT += testlib (note the absence of a "q").
Of note, you used to be able to do this: CONFIG += qtestlib, but according to the comment on this page, this is no longer the recommended way of linking to the test library.
I developed two classes for running a camera frame grabber in a console app (one to grab the images and one to process them) and would now like to implement these classes into an MFC project. The class works fine in the console app. When I attempted to use them in the MFC app I get LNK2019 errors. Here's some code pieces, the image display class is written in a very similar way:
IMAQ class (for grabing images):
IMAQ.h:
#pragma once
#include <queue>
#include <fstream>
#include "CircularInterface.h"
... // some more includes
class IMAQ
{
public:
explicit IMAQ();
virtual ~IMAQ();
int SetupAcq(pRTCaptureStruc pRTCaptStruc);
... // some more functions
// The image acquisition thread
UINT ImgAcqThread(LPVOID lpdwParam);
private:
BFU32 BdNum,
BdInitOptns,
NumBuffers,
CircInitOptions;
// image acquisition parameters
BFU32 ImageSize,
BitDepth,
Xsize,
Ysize,
NumPixels,
BytesPerPix;
bool GetFrame;
... // some more private members
}; // class IMAQ
IMAQ.cpp:
#include "..\\Include\\IMAQClass.h"
IMAQ::IMAQ()
{
BdNum = 0;
BdInitOptns = CiSysInitialize;
CircInitOptions = BiAqEngJ;
NumBuffers = 4;
FilePath = NULL;
_isClean = true;
}
IMAQ::~IMAQ()
{
// Empty destructor
}
int IMAQ::SetupAcq(pRTCaptureStruc pRTCaptStruc)
{
...// left out code for brevity
}
... // some more functions, all functions declared in header file are defined.
uOCT MFC AppDlg.h:
#pragma once
#include "ImgDspClass.h"
#include "IMAQClass.h"
#include "afxwin.h"
// CuOCTMFCAppDlg dialog
class CuOCTMFCAppDlg : public CDialogEx
{
public:
HBITMAP hBmpWellA6;
BITMAP BmpWellA6;
UINT8 *pBitsWellA6;
BITMAPINFOHEADER bmpInfo;
IMAQ ImgAcq;
ImgDspClass ImgDsp;
char *LUTpath;
char FileName[FILENAME_MAX];
... // more members
};
uOCT MFC AppDlg.cpp:
#include "stdafx.h"
#include "uOCT MFC App.h"
#include "uOCT MFC AppDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
BOOL CuOCTMFCAppDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// Change the file path here to change save location
ImgAcq.SetFilePath("C:\\Users\\uOCT clone\\Documents\\temporary\\test.dat");
ImgDsp.SetReferencePath("C:\\Users\\uOCT clone\\Documents\\temporary\\ref.dat");
return TRUE; // return TRUE unless you set the focus to a control
}
In my MFC dialog header file I include the IMAQClass.h header file which is sufficient for the console app to work correctly, yet, as I said above, the MFC app returns unresolved external symbol errors. MFC project seetings additional include directories includes the directory containing IMAQ header file.
Why am I receiving unresolved externals?
Thanks
Error message as requested:
1>uOCT MFC App.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall IMAQ::~IMAQ(void)" (??1IMAQ##UAE#XZ) referenced in function "public: virtual __thiscall CuOCTMFCAppDlg::~CuOCTMFCAppDlg(void)" (??1CuOCTMFCAppDlg##UAE#XZ)
1>uOCT MFC AppDlg.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall IMAQ::~IMAQ(void)" (??1IMAQ##UAE#XZ)
1>uOCT MFC App.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall ImgDspClass::~ImgDspClass(void)" (??1ImgDspClass##UAE#XZ) referenced in function "public: virtual __thiscall CuOCTMFCAppDlg::~CuOCTMFCAppDlg(void)" (??1CuOCTMFCAppDlg##UAE#XZ)
1>uOCT MFC AppDlg.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall ImgDspClass::~ImgDspClass(void)" (??1ImgDspClass##UAE#XZ)
1>uOCT MFC AppDlg.obj : error LNK2019: unresolved external symbol "public: __thiscall ImgDspClass::ImgDspClass(void)" (??0ImgDspClass##QAE#XZ) referenced in function "public: __thiscall CuOCTMFCAppDlg::CuOCTMFCAppDlg(class CWnd *)" (??0CuOCTMFCAppDlg##QAE#PAVCWnd###Z)
1>uOCT MFC AppDlg.obj : error LNK2019: unresolved external symbol "public: __thiscall IMAQ::IMAQ(void)" (??0IMAQ##QAE#XZ) referenced in function "public: __thiscall CuOCTMFCAppDlg::CuOCTMFCAppDlg(class CWnd *)" (??0CuOCTMFCAppDlg##QAE#PAVCWnd###Z)
1>uOCT MFC AppDlg.obj : error LNK2019: unresolved external symbol "public: int __thiscall ImgDspClass::SetReferencePath(char * const)" (?SetReferencePath#ImgDspClass##QAEHQAD#Z) referenced in function "protected: virtual int __thiscall CuOCTMFCAppDlg::OnInitDialog(void)" (?OnInitDialog#CuOCTMFCAppDlg##MAEHXZ)
1>uOCT MFC AppDlg.obj : error LNK2019: unresolved external symbol "public: int __thiscall IMAQ::SetFilePath(char * const)" (?SetFilePath#IMAQ##QAEHQAD#Z) referenced in function "protected: virtual int __thiscall CuOCTMFCAppDlg::OnInitDialog(void)" (?OnInitDialog#CuOCTMFCAppDlg##MAEHXZ)
EDIT: Problem solved, but I guess I don't really understand why.
So the comments posted said that I needed to link to the library file. The two classes I was having a problem with do not generate .dll nor .lib files, just .obj. But on a whim I went back and included the .obj file to the link dependencies.
So now my question is: .obj files need to be linked like libraries if they are not generated along with the executable?
You haven't given us enough detail to help you. You have told us that you are getting a linker error, but you need to tell us the exact error message, i.e., which symbols are undefined?
Here is my guess; you have included an additional header file. This header file is part of a library, but you have not linked in the library itself, only included the header. So you got the first part right, now you need to open up your linker settings page, add the additional library directory (i.e., where the .lib, .obj, .whatever implementation file resides), and then add the name of the library to the "Additional Dependencies" section.