Bur*_*ard 5 c++ ubuntu linker gcc4.4
我在两个单独的文件中创建了一个类:
modul1.h
#ifndef MODUL1_H
#define MODUL1_H
#include <iostream>
#include <fstream>
#include "easylogger.h"
class Modul1
{
public:
Modul1(std::string name);
protected:
private:
easylogger::Logger *log;
};
#endif // MODUL1_H
Run Code Online (Sandbox Code Playgroud)
和modul1.cpp
#include "modul1.h"
Modul1::Modul1(std::string name):log(new easylogger::Logger(name))
{
//ctor
//std::ofstream *f = new std::ofstream(name.c_str(), std::ios_base::app);
//log->Stream(*f);
//log->Level(easylogger::LEVEL_DEBUG);
//LOG_DEBUG(*log, "ctor ende!");
}
Run Code Online (Sandbox Code Playgroud)
现在我想在另一个文件(main.cpp)中使用这个类:
#include "modul1.h"
int main()
{
std::cout << "Hello world!" << std::endl;
Modul1 mod1("test.log");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我使用以下Makefile编译它时,我得到一个"多个定义..."错误:
g ++ main.o modul1.o -o main modul1.o:在函数
easylogger::Logger::Format(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': modul1.cpp:(.text+0x0): multiple definition ofeasylogger :: Logger :: Format(std :: basic_string,std :: allocator> const&)'main.o:main.cpp :(.text + 0x0 ):首先在这里定义modul1.o:在函数easylogger::Logger::WriteLog(easylogger::LogLevel, easylogger::Logger*, char const*, unsigned int, char const*, char const*)': modul1.cpp:(.text+0x2a): multiple definition ofeasylogger :: Logger :: WriteLog(easylogger :: LogLevel,easylogger :: Logger*,char const*,unsigned int,char const*,char const*)'main.o: main.cpp :(.text + 0x2a):首先在这里定义collect2:ld返回1退出状态
(起初我用代码:: blocks编译它并得到了相同的错误)
如何修改我的Modul1以避免出现此链接错误?我认为这不重要,但我使用的是一些带有g ++ 4.4.3的Ubuntu 64bit
Makefile文件:
CC=g++
CFLAGS=-c -Wall
all: log_test
log_test: main.o easylogger.h modul1.o
$(CC) main.o modul1.o -o main
main.o: main.cpp modul1.h
$(CC) $(CFLAGS) main.cpp
modul1.o: modul1.cpp modul1.h
$(CC) $(CFLAGS) modul1.cpp
Run Code Online (Sandbox Code Playgroud)
您构建它的方式,easylogger.h(以及因此easylogger-inl.h)被包含两次,一次用于modul1.h,一次用于main.cpp
你对它的使用是错误的。但是您可以这样做以使其工作:
在 modul1.h ( 删除 #include "easylogger.h") 并使它看起来像这样
#ifndef MODUL1_H
#define MODUL1_H
#include <iostream>
#include <fstream>
//#include "easylogger.h"
namespace easylogger { class Logger; };
class Modul1
{
public:
Modul1(std::string name);
protected:
private:
easylogger::Logger *log;
};
#endif // MODUL1_H
Run Code Online (Sandbox Code Playgroud)
对于 modul1.cpp,包括真实的东西
#include "modul1.h"
#include "easylogger.h"
Modul1::Modul1(std::string name):log(new easylogger::Logger(name))
{
//ctor
//std::ofstream *f = new std::ofstream(name.c_str(), std::ios_base::app);
//log->Stream(*f);
//log->Level(easylogger::LEVEL_DEBUG);
//LOG_DEBUG(*log, "ctor ende!");
}
Run Code Online (Sandbox Code Playgroud)
祝你好运!
| 归档时间: |
|
| 查看次数: |
34706 次 |
| 最近记录: |