2

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

ESI
|
|__Sub1
|
|__Sub2

在 Sub2 (demo1.cpp) 项目中的类的实现文件 (.cpp) 中,我需要包含 Sub1 项目的类。所以在 demo1.cpp 我已经声明:

#include "../sub1/controller.h"

为什么链接器找不到控制器的构造函数?(说未定义的参考)

谢谢

4

1 回答 1

2

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

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


假设Sub1是一个库,它将生成为sub1.lib

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

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

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


如果Sub1Sub2都是可执行文件(即项目产生一个.exe)文件,您需要将公共内容提取到一个单独的项目中,该项目在其文件Sub3TEMPLATE = lib而不是TEMPLATE = app在其.pro文件中。

于 2013-01-21T12:10:51.400 回答