2014-11-22 167 views
0

我在项目中有n个cpp文件。'A'是将有主函数的源文件,'B'是另一个包含函数定义的源文件,它将被'一个'。visual studio源文件构建命令

A.cpp #include "stdafx.h" #include "b.h" int main() { add(5,4); return 0; }

了Bh

#include "stdafx.h" void add(int a ,int b);

B.cpp

#include "stdafx.h" void add(int a,int b) { cout<<(a+b); }

但建造顺序是一样a.cpp b.cpp后使添加函数应该由链接器解析。 我该如何解决构建顺序问题?

编辑1:我的构建文件日志: -

构建开始22-11-2014 15点57分11秒。 1>节点2(构建目标)上的项目“C:\ Users \ Admin \ Documents \ Visual Studio 2013 \ Projects \ ConsoleApplication2 \ ConsoleApplication2 \ ConsoleApplication2.vcxproj”。 1> Link: 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 x86 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/D YNAMICBASE/NXCOMPAT/IMPLIB:“C:\ Users \ Admin \ Documents \ Visual Studio 2013 \ Projects \ ConsoleApplication2 \ Release \ ConsoleApplication2.lib”/ MACHINE:X86/SAFESEH Release \ CLM.obj Release \ 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)" ([email protected]@[email protected]@[email protected]) 
1>updated_facetracker_v2.obj : error LNK2001: unresolved external symbol "struct _GLMmodel * __cdecl glmReadOBJ(char *)" ([email protected]@[email protected]@[email protected]) 
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

您应该查看错误窗口以轻松查看所有错误并确定发生的第一个错误。 – sjdowling 2014-11-22 10:35:21

+0

该错误与您给出的示例无关,但应该有更高的编译错误。 – tillaert 2014-11-22 10:35:39

+0

上面的例子很容易理解 – 2014-11-22 10:36:23

回答

1

。由于B.cpp没有编译,因此编译器无法为B.cpp创建一个对象,由于对象不存在,链接器找不到它,并给出错误信息,应该有一个关于B.cpp的错误up error log。

Change 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)这是根据链接器不同的功能。