我有一个包含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等)。如果
Sub1
和Sub2
都是可执行文件(即项目生成.exe
)文件,则需要将公共(public)内容提取到单独的项目Sub3
中,该项目的TEMPLATE = lib
而不是TEMPLATE = app
文件中的.pro
。