【问题标题】:How to make qt not omit methods?如何让qt不省略方法?
【发布时间】:2014-02-11 07:02:23
【问题描述】:

我有以下 Qt 项目结构:

静态库 #1

public class LibraryClass
{
     public int Test();
}

静态库 #2(引用库 #1)

void SomeMethod()
{
   ...
   x = library1Instance.Test();
   ...
}

可执行文件(引用库 #1 和库 #2)

void SomeOtherMethod()
{
   ...
   library2Instance.SomeMethod();
   ...
}

库 #1 和库 #2 编译时没有错误。但是当我尝试编译可执行文件时,出现错误“未定义对 LibaryClass::Test() 的引用”。这意味着库 #1 是在没有 LibraryClass::Test() 方法的情况下链接的。

如果我在库 #1 中创建另一个类,并将该类引用到 LibaryClass::Test() 方法,那么一切都会编译。

据我了解,编译器省略了 LibaryClass::Test() 方法,因为它找不到对其的内部引用。所以,我应该以某种方式将其标记为导出方法或其他东西。我该怎么做?

【问题讨论】:

  • 你是如何链接程序的?静态库的顺序很重要:#1 必须在 #2 之后才能解决依赖关系。
  • 如何查看链接顺序?我正在使用 Qt Creator。我能找到的唯一同时存在库#1 和#2 的地方是executable.pro 文件(这是我引用这些库的地方)
  • 是的,看来我应该将 library#1 引用放在 .pro 文件的最后。谢谢,迈克!

标签: c++ qt compiler-errors mingw qmake


【解决方案1】:

您应该在所有项目中包含的文件中进行全局定义:

#if defined(MAKEDLL)
# define MY_EXPORT Q_DECL_EXPORT
#else
# define MY_EXPORT Q_DECL_IMPORT
#endif

在库中,将此行添加到.pro 文件中:

DEFINES   += MAKEDLL

在可执行文件的.pro 中,不添加任何内容。然后,在库中将LibraryClass 定义为

public MY_EXPORT class LibraryClass
{
    ...
}

对于静态方法:

MY_EXPORT void SomeMethod()
{
   ...
   x = library1Instance.Test();
   ...
}

在可执行文件中,实例化类并照常调用方法。如果您的子项目(库 1、库 2 和可执行文件)构建到同一目录,链接器将解析依赖关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2012-09-20
    • 2014-05-20
    相关资源
    最近更新 更多