在静态库基类中删除C ++内联默认构造函数

时间:2016-05-05 17:18:14

标签: c++ c++11 inheritance gcc c++14

我想要对这种行为进行健全检查。

libraryOne.a

class myBase
{
public:
   myBase();
   virtual ~myBase() {};

   myBase(const myBase& m) = default;
   myBase& operator=(const myBase& m)= default;

   myBase(myBase&& m)= default;
   myBase& operator=(myBase&& m)= default;

   virtual void ImplementMe() = 0;

   void AnotherFunction();

private:
   std::vector<SomeOtherClass> m_data;
};

library2.a

class myDerived : public MyBase
{
public:
   myDerived();
   ~MyDerived();

   virtual void ImplementMe() override;
}

观察

使用上面的场景,想象一下基类中的函数AnotherFunction(),它定义了一个for循环:

for(auto d : m_data)

我随便注意到循环正在复制。卫生署!所以我解决了。我们也没有改变它,所以我把它变成了常量。

for(const auto& d : m_data)

突然,我的应用程序由LibraryOne.a和Library2.a中的一个可执行文件链接组成,无法链接。对for循环的更改是唯一的变化。链接错误是残暴的,但我推断我已经从libraryOne.a中删除了所有复制构造函数的使用,因此编译器将其剥离。 &#34; =默认&#34;创建内联构造函数,从我理解的内容函数可以删除未使用的内联函数。当应用程序转到链接时,Library2.a不再找到基类的复制构造函数并失败。

我通过使用其余的类定义在.cpp文件中定义构造函数来解决问题。

问题

这是解决问题的正确方法吗?是否有一种可移植的方式告诉编译器不要抛弃默认的构造函数,因为类可能会从另一个库中继承它?

我在ubuntu上使用GCC 5.3.1。

$ gcc --version
gcc (Ubuntu 5.3.1-14ubuntu2) 5.3.1 20160413
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

更新

最终导致链接订单错误。这是我对gnu链接器的理解(如果我错了,你可以再次纠正我。)

链接器在链接步骤中从左到右处理静态库。在我的例子中,它首先遇到了libraryone.a,并删除了构造函数,因为它们没有在库中使用。然后它命中了需要它们的library2.a,我得到了未解析的符号。

当我首先放置library2.a时,链接器将记录未解析的符号,当它遇到时,然后在libraryone.a中它不会删除它们。

现在我认为这是问题所在。我做了一个简单的改变,链接器说,&#34; nope,不再需要这些&#34;我得到了错误。

当我意识到发生了什么时,我正在整理一个例子。

0 个答案:

没有答案