2014-02-11 61 views
2

我具有以下Qt工程结构:如何让qt不忽略方法?

静态库#1

public class LibraryClass 
{ 
    public int Test(); 
} 

静态库#2(参照库#1)

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

可执行文件(参考库#1和库#2)

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

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

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

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

+1

你究竟如何链接程序?该命令对静态库非常重要:#1必须在#2后解决依赖关系。 –

+0

如何检查链接顺序?我正在使用Qt Creator。我能找到的只有libarary#1和#2的地方是executable.pro文件(这是我参考这些库的地方) – developer

+0

是的,看来我应该将库#1引用放在.pro文件的最后。谢谢,迈克! – developer

回答

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和可执行文件)构建到相同的目录中,链接器将解析依赖关系。