【发布时间】:2014-04-20 07:21:30
【问题描述】:
在构建时出现以下错误:
main.obj:错误 LNK2019:函数“main”中未解析的外部符号“”public:__cdecl Worker::Worker(void)“(??0Worker@@QEAA@XZ)”。
main.obj:错误 LNK2019:函数“main”中无法解析的外部符号“”public:virtual __cdecl Worker::~Worker(void)”(??1Worker@@UEAA@XZ)”。
我找不到问题。 (我也看了here)
main.cpp
#include <iostream>
#include <thread>
#include "worker.h"
using namespace std;
void pause_thread(int n)
{
std::this_thread::sleep_for (std::chrono::seconds(n));
std::cout << "pause of " << n << " seconds ended\n";
}
int main()
{
std::cout << "Spawning and detaching 3 threads...\n";
std::thread (pause_thread,1).detach();
std::thread (pause_thread,2).detach();
std::thread (pause_thread,3).detach();
std::cout << "Done spawning threads.\n";
std::cout << "(the main thread will now pause for 5 seconds)\n";
// give the detached threads time to finish (but not guaranteed!):
pause_thread(5);
Worker w;
return 0;
}
worker.h
#ifndef WORKER_H
#define WORKER_H
#include "jobqueue.h"
#include "job.h"
#include <mutex>
#include <thread>
using namespace std;
class Worker
{
private:
JobQueue jobs;
mutex mu;
thread & workerThread;
bool stop;
void work();
public:
Worker();
virtual ~Worker();
void addJob(Job*);
int getJobCount();
};
#endif // WORKER_H
worker.cpp
#include "worker.h"
Worker::Worker(): workerThread(work), stop(false)
{
}
Worker::~Worker()
{
workerThread.join();
}
void Worker::work(){
while (!stop) {
unique_lock<mutex> lock(mu, defer_lock);
lock.lock();
Job* job = jobs.getNextJob();
lock.unlock();
job->run();
delete job;
}
}
void Worker::addJob(Job* job){
jobs.append(job);
}
int Worker::getJobCount(){
unique_lock<mutex> lock(mu);
return jobs.size();
}
project.pro
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += main.cpp \
jobqueue.cpp \
worker.cpp
HEADERS += \
jobqueue.h \
worker.h \
job.h
删除 Project.pro.user 解决了(主要)问题,现在再次显示错误
【问题讨论】:
-
您必须提供所有目标文件以进行链接。您可能错过了包含 worker.o 目标文件。
-
作为 IDE,我使用 QT Creator 和 MSVC 2012 64Bit 作为编译器。我将在上面发布我的项目文件。
-
C++ 类的构造函数和解构函数的调用约定是 __thiscall,而不是 __cdecl。很难猜出你是怎么做到的。
-
删除 project.pro.user 文件后出现编译错误。 @Manu343726 我正在学习 C++。我从 Java 切换过来,所以我不是 C++ 专家。在 C++ 中,您必须了解 Java 中的所有错误,编译器具有更好的错误检测能力。顺便说一句,如果我想让线程调用 Worker::work() 方法,最好的方法是什么?