如何让qt不省略方法?

时间:2014-02-11 07:02:23

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

我有以下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()的未定义引用”。这意味着没有LibraryClass :: Test()方法链接libary#1。

如果我在库#1中创建另一个类,并使该类引用LibaryClass :: Test()方法,则所有内容都将编译。

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

1 个答案:

答案 0 :(得分: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();
   ...
}

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