참조(Reference) 란 무엇일까?
☞ 솔루션에 A프로젝트와 B 프로젝트가 추가되어 있고 B가 두수의
합을 구하는 Sum()이라는 메소드를 구현 했습니다. A가 B의 Sum()을
사용하려고 할때 A는 어떤 형태로든 B에 대해서 알고 있어야 Sum()을
호출 해서 사용할 수 있습니다. 이런 관계를 A가 B를 참조 한다고 표현
합니다.
2005 이전 버전에서의 참조(Reference) 란 무엇일까?
☞ 참조라는 개념은 2005 버전 서부터 생겨났습니다. 이전 버전에서는
프로젝트 종속성(Project Dependencies) 이라는 개념이 존재 했습니다.
프로젝트 설정 창에서 설정할수 있으며 A 프로젝트 설정 창에서
종속성에 B를 추가합니다. 즉 이말은 A가 실행되기 위해서는 B가 필요하다는
뜻입니다. 해당 프로젝트 종속성의 설정 정보는 솔루션 파일( .sln ) 에 저장되며
파일의 내용은 아래와 같습니다.
프로젝트.vcproj 가 추가된 프로젝트 를 Reference 한다는 뜻이다.
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Console", "프로젝트.vcproj", "{BE4481B0-3EAC-45C3-98A3-136C2DBBC81E}"
ProjectSection(ProjectDependencies) = postProject
{8A027C57-7AE5-424D-8487-0B1BA3E6FD58} = {8A027C57-7AE5-424D-8487-0B1BA3E6FD58} <= 추가된 프로젝트
{8A80B5FA-C017-49DF-9DC0-EDFB91F392C0} = {8A80B5FA-C017-49DF-9DC0-EDFB91F392C0}
EndProjectSection
EndProject
2010 버전에서의 참조(Reference) 가 어떻게 변했나?
☞ 이전 버전에서는 원하는 프로젝트를 Project Dependencies 에서만 설정하면 되었는데 2010 버전에서는
References... 에 해당 라이브러리를 추가해야 합니다. 사실 2005 버전서부터 프로젝트 종속성과 레퍼런스는
공존해 왔습니다. 다만 2010 버전에서는 참조가 필수가 되었습니다. 그 이유에 대해서는 마지막에 링크 되어 있는 문서를 참조하시기 바랍니다 Project Dependencies는 Build Order 만 관계가 있고 실제 참조 작업시 필요한 정보는 References... 에서 추가해야만 한다.
추가된 정보는 프로젝트 파일( .vcxproj ) 에 저장되며 내용은 아래와 같다.
Project Dependencies
<ItemGroup>
<ProjectReference Include="레퍼런스로 추가한 프로젝트.vcxproj">
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
무엇이 달라진걸까?
2010 버전이든 이전 버전이든 References...의 개념은 존재 했다. 다만 2010 버전에서는 강제적으로 References...에 추가하지 않으면 참조가 불가능해져 Linking 작업시 해당 메소드의 구현부를 찾을수 없어 실패한다.
프로젝트 참조에 관한 내용의 저장위치의 차이점은 무엇일까?
☞ 솔루션 파일이 없어도 특정 프로젝트를 빌드할수 있다.
여러개의 솔루션 파일을 관리할때 솔루션 파일 마다 종속성을 설정하는것보다
개별 프로젝트에 참조를 설정해 놓으면 여러개의 솔루션 파일을 관리하는 것이 조금 더 안정적이다.
2005에서의 참조 테스트 로 정리 해보자.
A 정적 라이브러리
B 정적 라이브러리
C 실행가능한 어플리케이션
참조 설정 없이 C 에서 B의 메소드를 사용하고 해당 B의 메소드 구현부에서 A의 메소드를 호출하는 경우
A를 리빌드 할 경우 :
- A에서 참조하는 프로젝트가 없기에 문제가 발생하지 않는다.
1>------ Rebuild All started: Project: A, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'A', configuration 'Debug|Win32'
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>A.cpp
1>Creating library...
1>Build log was saved at "file://d:\TestSolution\A\Debug\BuildLog.htm"
1>A - 0 error(s), 0 warning(s)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
B를 리빌드 할 경우 :
- 에러가 발생하지 않는다. 비록 B가 참조 과정 없이 A의 메소드를
호출 하고는 있지만 실제 구현부는 Linking 작업에만 필요하기 때문이다.
1>------ Rebuild All started: Project: B, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'B', configuration 'Debug|Win32'
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>B.cpp
1>Creating library...
1>Build log was saved at "file://d:\TestSolution\B\Debug\BuildLog.htm"
1>B - 0 error(s), 0 warning(s)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
C를 리빌드 할 경우 :
- C가 컴파일 될때까지는 에러가 없지만 Linking 작업시 B의 메소드가
A의 실제 구현부를 찾을수 없어 에러가 발생한다.
1>------ Rebuild All started: Project: Exe, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'Exe', configuration 'Debug|Win32'
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>Exe.cpp
1>Compiling manifest to resources...
1>Linking...
1>Exe.obj : error LNK2019: unresolved external symbol "void __cdecl B(void)" (?B@@YAXXZ) referenced in function _wmain
1>D:\TestSolution\Debug\Exe.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://d:\TestSolution\Exe\Debug\BuildLog.htm"
1>Exe - 2 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
Visual Studio 6
Visual Studio 2003 7
Visual Studio 2005 8
Visual Studio 2008 9
Visual Studio 2010 10
Visual Studio 2010 C++ Project Upgrade Guide
http://blogs.msdn.com/b/vcblog/archive/2010/03/02/visual-studio-2010-c-project-upgrade-guide.aspx
Flexible Project-to-Project References
http://blogs.msdn.com/b/vcblog/archive/2010/05/03/flexible-project-to-project-references.aspx
'공개 포스팅' 카테고리의 다른 글
ogg 를 mp3 로 변환 - Free Mp3 Wma Converter 프리웨어 (0) | 2011.05.06 |
---|---|
오쿠 8700 RN 구입 완료. 모델별 차이는? (4) | 2011.04.24 |
니콘 a shot a day TV CF (0) | 2011.03.31 |
무선랜 속도 (0) | 2011.03.26 |
Visual Studio 2010 - IntelliSense error (0) | 2011.03.26 |