我在c ++ / ubuntu工作。 我有:
#ifndef LIBR
#define LIBR
#include <string>
using namespace std;
class name
{
public:
name();
~name();
std::string my_name;
std::string method (std::string s);
};
#endif
和
#include <iostream>
#include <string>
#include <stdlib.h>
#include "libr.hpp"
using namespace std;
name::name()
{
}
std::string name::method(std::string s)
{
return ("YOUR NAME IS: "+s);
}
从这两个我创建了一个libr.a
。
在test.cpp中:
#include <iostream>
#include <string>
#include <stdlib.h>
#include "libr.hpp"
using namespace std;
int main()
{
name *n = new name();
n->my_name="jack";
cout<<n->method(n->my_name)<<endl;
return 0;
}
我用g ++和libr.a编译。我有一个错误:“name :: name()undefined reference”,为什么?
我想提一下,我已经在.a
的qmake中添加了qt创建者。当我编译时,我有错误。我该如何解决?
答案 0 :(得分:1)
这是链接器错误,而不是编译器错误。这意味着您已经调用但尚未定义构造函数。您的分配name *n = new name();
会调用构造函数。
由于你在libr.cpp中定义了构造函数,这意味着这个编译单元没有进入你的可执行文件。您提到您正在使用libr.a进行编译。编译libr.cpp时,结果是.o文件,而不是.a文件。
您没有将libr.o链接到您的可执行文件中。
答案 1 :(得分:0)
您用于编译“项目”的步骤是什么?
我执行了以下步骤并设法使用警告/错误构建它。
g++ -Wall -c libr.cpp
ar -cvq libr.a libr.o
g++ -Wall -o libr main.cpp libr.a
最后一件事,如果我改变了最后一个命令的顺序,比如
g++ -Wall -o libr libr.a main.cpp
我收到以下错误:
Undefined first referenced
symbol in file
name::name() /tmp/cc4Ro1ZM.o
name::method(std::basic_string<char, std::char_traits<char>, std::allocator<char
> >)/tmp/cc4Ro1ZM.o
ld: fatal: Symbol referencing errors. No output written to libr
collect2: ld returned 1 exit status
答案 2 :(得分:0)
实际上,您不需要自己定义析构函数,因为在类调用结束时将使用默认析构函数。 在VS2008中,没关系!