我在项目中有n个cpp文件。'A'是具有main函数的源文件,'B'是另一个源文件,其中包含将被'A'使用的函数定义。
A.cpp
#include "stdafx.h"
#include "b.h"
int main()
{
add(5,4);
return 0;
}
B.h
#include "stdafx.h"
void add(int a ,int b);
B.cpp
#include "stdafx.h"
void add(int a,int b)
{
cout<<(a+b);
}
但构建顺序类似于b.cpp之后的a.cpp,因此链接器应该无法解析add函数。 我该如何解决构建顺序问题?
编辑1:我的构建文件日志: -
Build build 22-11-2014 15:57:11。 1&gt;节点2上的项目“C:\ Users \ Admin \ Documents \ Visual Studio 2013 \ Projects \ ConsoleApplication2 \ ConsoleApplication2 \ ConsoleApplication2.vcxproj”(构建目标)。 1 GT;链接: C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ bin \ link.exe / ERRORREPORT:PROMPT / OUT:“C:\ Users \ Admin \ Documents \ Visual Studio 2013 \ Projects \ ConsoleApplication2 \ Release \ ConsoleApplication2。 exe“/ INCREMENTAL:NO / NOLOGO / LIBPATH:D:\ Glut / LIBPATH:D:\ OpenCV \ opencv \ build \ x86 \ vc11 \ lib opencv_core246.lib opencv_features2d246.lib opencv_haartraining_engine.lib opencv_calib3d246.lib opencv_highgui246.lib opencv_imgproc246.lib opencv_legacy246.lib opencv_ml246.lib opencv_objdetect246.lib opencv_video246.lib glut32.lib asmlibrary.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32。 lib odbccp32.lib / MANIFEST / MANIFESTUAC:“level ='asInvoker'uiAccess ='false'”/ manifest:embed / DEBUG / PDB:“C:\ Users \ Admin \ Documents \ Visual Studio 2013 \ Projects \ ConsoleApplication2 \ Release \ ConsoleApplication2.pdb“/ SUBSYSTEM:CONSOLE / OPT:REF / OPT:ICF / LTCG / TLBID:1 / DYNAMICBASE / NXCOMPAT / IMPLIB:”C:\ Users \ Admin \ Documents \ Visual Studio 2013 \ P rojects \ ConsoleApplication2 \ Release \ ConsoleApplication2.lib“/ MACHINE:X86 / SAFESEH Release \ CLM.obj 释放\ FCheck.obj
Release\FDet.obj
Release\IO.obj
Release\Patch.obj
Release\PAW.obj
Release\PDM.obj
Release\Tracker.obj
Release\updated_facetracker_v2.obj
Release\glm.obj
Release\glmimg.obj
Release\glmimg_devil.obj
Release\glmimg_jpg.obj
Release\glmimg_png.obj
Release\glmimg_sdl.obj
Release\glmimg_sim.obj
Release\glm_util.obj
Release\stdafx.obj
1>updated_facetracker_v2.obj : error LNK2001: unresolved external symbol "void __cdecl glmDraw(struct _GLMmodel *,unsigned int)" (?glmDraw@@YAXPAU_GLMmodel@@I@Z)
1>updated_facetracker_v2.obj : error LNK2001: unresolved external symbol "struct _GLMmodel * __cdecl glmReadOBJ(char *)" (?glmReadOBJ@@YAPAU_GLMmodel@@PAD@Z)
1>C:\Users\Admin\Documents\Visual Studio 2013\Projects\ConsoleApplication2\Release\ConsoleApplication2.exe : fatal error LNK1120: 2 unresolved externals
1>Done Building Project "C:\Users\Admin\Documents\Visual Studio 2013\Projects\ConsoleApplication2\ConsoleApplication2\ConsoleApplication2.vcxproj" (Build target(s)) -- FAILED.
构建失败。
时间流逝00:00:00.81
这是原始项目构建文件,这里glm.c是在updated_facetracker_v2.cpp文件和glm.c之后构建的,没有任何错误。“
答案 0 :(得分:2)
您的链接器fais,因为B.cpp
无法编译。编译器无法为B.cpp
创建对象。由于该对象不存在,链接器无法找到它,并给出错误。错误日志中应该有B.cpp
错误。
更改B.cpp
:
#include "stdafx.h"
void add(int a,int b)
{
cout<<(a+b);
}
为:
#include "stdafx.h"
#include <iostreams>
void add(int a,int b)
{
std::cout<<(a+b) << std::endl;
}
构建顺序无关紧要:编译器获取每个源文件并创建目标文件。链接器获取目标文件并尝试将它们链接到目标可执行文件。编译器生成目标文件的顺序无关紧要。
另外,你的主要也是错误的:
改变:
add(5+4);
为:
add(5, 4);
您尝试链接add(int)
,而B.cpp
中的函数具有签名add(int, int)
,根据链接器,该签名是{{1}}。