visual studio源文件构建顺序

时间:2014-11-22 10:23:18

标签: c++ visual-studio-2012

我在项目中有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之后构建的,没有任何错误。“

1 个答案:

答案 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}}。