我有以下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(),因为它找不到内部引用。所以,我应该以某种方式将其标记为出口方法或其他东西。我该怎么办?
答案 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)构建到同一目录,链接器将解析依赖项。