使用extern时使用gcc重定位错误

时间:2016-06-26 11:16:23

标签: c++

我收到以下代码的重定位错误。请有人帮我解决问题。

A.hpp

namespace
{
class A
{
    public:
        A(const std::string&);
        //Few Get() methods
    private:
        //Some private stuff
};
    extern A objA;
}

A.cpp

#include<A.hpp>

const std::string str("FIXED STRING HERE");
A objA(str);

A::A(const std::string& Istring)
{
    //Some data processing here
}

ClientCode.cpp

#include<A.hpp>



// Want to access A::get() here using objA;
objA.Get();

我收到以下错误:

  

重定位R_X86_64_PC32对未定义的符号`(匿名命名空间):: str&#39;制作共享对象时不能使用;用-fPIC重新编译
  最终链接失败:错误值
  collect2:ld返回1退出状态

此外,请有人知道这个外部对象的内存何时被分配。 我的主要目的是只有A类的单个对象,并且只要我包含A.hpp

,就可以在许多文件中使用它

3 个答案:

答案 0 :(得分:1)

A.hpp

namespace ABC
{
    class A
    {
        public:
            A(const std::string&);
            //Few Get() methods
        private:
            //Some private stuff
    };
  extern A objA;
}

A.cpp

#include<A.hpp>
namespace ABC
{
     const std::string str("FIXED STRING HERE");
      A objA(str);

      A::A(const std::string& Istring)
      {
         //Some data processing here
      }
}

ClientCode.cpp

#include<A.hpp>
// Want to access A::get() here using objA;
ABC::objA.Get();

答案 1 :(得分:0)

使用extern显式声明str中的objAClientCode.cpp作为从其他cpp源文件编译的其他目标文件定义的待链接符号。< / p>

#include<A.hpp>

extern const std::string str;
extern A objA;

// Want to access A::get() here using objA;
objA.Get();

============ 的修改

同时删除extern

中的A.hpp语句
namespace
{
class A
{
    public:
        A(const std::string&);
        //Few Get() methods
    private:
        //Some private stuff
};
    //extern A objA;
}

答案 2 :(得分:0)

重定位错误可能是由于&#34;匿名&#34; namespace ..您必须为命名空间指定一个名称。

关于何时为外部对象标识符分配内存的问题,就是在调用对象构造函数时。将对象标识符声明为外部可以向编译器指示标识符可以在多个文件中使用,因此在链接时,包含该标识符的所有文件都指向同一个对象。

显然,实例化(何时何地)取决于程序员,他有责任正确地执行此操作以避免对象未实例化错误,这是一种空引用错误。