我有一个包含2个子项目(Sub1和Sub2)的项目:

ESI
|
|__Sub1
|
|__Sub2

在Sub2(demo1.cpp)项目中某个类的实现文件(.cpp)中,我需要包含Sub1项目的类。因此,在demo1.cpp中,我声明了:
#include "../sub1/controller.h"

为什么链接器找不到 Controller 的构造函数? (表示未定义的引用)

谢谢

最佳答案

您的#include告诉编译器在哪里可以找到controller类的定义(即controller.h文件的内容)。

为了链接到controller类的实现,链接器需要一个包含已编译实现的库。 -除非您在Sub2项目中包括Sub1.cpp文件,否则Sub1项目不会再次编译Sub2的内容,但这是一种不好的做法,并且可能导致进一步的问题。

假设Sub1是一个将作为sub1.lib生成的库:

您需要将以下行添加到.pro项目的Sub2文件中:

LIBS += -L../Sub1 \
        -lsub1

这告诉链接器,存在一个包含库的“../Sub1”目录,并且存在一个名为“sub1.lib”的库。使用-L-l语法的优点是,它适用于所有平台(Windows,Linux,Mac等)。

如果Sub1Sub2都是可执行文件(即项目生成.exe)文件,则需要将公共(public)内容提取到单独的项目Sub3中,该项目的TEMPLATE = lib而不是TEMPLATE = app文件中的.pro

10-08 07:33