我有一个包含 2 个子项目(Sub1 和 Sub2)的项目:
ESI
|
|__Sub1
|
|__Sub2
在 Sub2 (demo1.cpp) 项目中的类的实现文件 (.cpp) 中,我需要包含 Sub1 项目的类。所以在 demo1.cpp 中我声明了:
#include "../sub1/controller.h"
为什么链接器找不到控制器的构造函数? (说未定义的参考)
您的
#include
告诉编译器在哪里可以找到您的controller
类的定义(即您的
controller.h
文件的内容)。
为了链接到 controller
类的
implementation,链接器需要一个包含已编译实现的库。 -
Sub2
项目不会再次编译Sub1
的内容,除非您将.cpp
的Sub1
文件包含在您的Sub2
项目中,但这将是不好的做法,并可能导致进一步的问题。
假设
Sub1
是一个库,将生成为 sub1.lib
:
您需要将以下行添加到您的
.pro
项目的 Sub2
文件中:
LIBS += -L../Sub1 \
-lsub1
这告诉链接器有一个包含库的“../Sub1”目录,并且有一个名为“sub1.lib”的库。使用
-L
和 -l
语法的优点是它适用于所有平台(Windows、Linux、Mac 等)。
如果
Sub1
和 Sub2
都是可执行文件(即项目生成 .exe
)文件,则需要将公共内容提取到单独的项目 Sub3
中,该项目的项目中包含 TEMPLATE = lib
而不是 TEMPLATE = app
.pro
文件。