2016-07-05 2 views
1

저는 총 3 개의 프로젝트로 내 문제를 설명하기 위해 두 가지 솔루션을 설정했습니다. 디버그 모드에서 컴파일하지만 릴리스 모드로 컴파일해도 문제가 계속 발생합니다.Visual Studio LNK1104 최소 예 :

MyRunnerCore.lib3rdParty.lib이 필요합니다. 왜 그런가? 내가 그걸 어떻게 할 수 있니?

SolutionLayout

아이디어는 내가 lib 디렉토리 프로젝트 (잘 작동)로 타사를 구축한다는 것입니다 : 여기

은 폴더를 구성하는 방법을 설명하는 그림이다. 그런 다음 cpp 파일의 lib 파일을 사용하여 MyRunnerCore를 빌드합니다 (올바르게 작동합니다). 마지막으로는 아니지만 MyRunnerCore.lib (LNK1104)를 사용하는 콘솔 응용 프로그램을 빌드합니다. 출력 창은 다음과 같이 표시됩니다.

1>------ Build started: Project: MyRunnerCore, Configuration: Release Win32 ------ 
1> Core.cpp 
1> MyRunnerCore.vcxproj -> C:\SO\MyRunner\Release\MyRunnerCore.lib 
2>------ Build started: Project: MyRunner, Configuration: Release Win32 ------ 
2> main.cpp 
2>LINK : fatal error LNK1104: cannot open file '3rdParty.lib' 
========== Build: 1 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

다음은 Project가 어떤 설정을 편집 한 것을 가리키는 주석이있는 소스 파일입니다.

ThirdPartyClass.cpp

#include "ThirdParyClass.hpp" 
int ThirdParyClass::GenerateNumber() 
{ return 4; } 

ThirdPartyClass.hpp

#pragma once 
class ThirdParyClass 
{ public: int GenerateNumber(); }; 

MAIN.CPP

//MyRunner Properties: 
//Project Dependencies Added MyRunnerCore 
//Include Directories Added $(SolutionDir) 
//Library Directories Added $(OutDir) 
#include <MyRunnerCore\Core.h> 
#pragma comment (lib, "MyRunnerCore.lib") 

int main() { Core c{}; return c.Run(); } 

Core.cpp

#include "Core.h" 
//MyRunnerCore Properties: 
//Added To Include Path C:\SO\3rdParty 
//Added To Library Path C:\SO\3rdParty\Debug 
#include <3rdParty\ThirdParyClass.hpp> 
#pragma comment(lib, "3rdParty.lib") 

int Core::Run() 
{ 
    ThirdParyClass tp{}; 
    return tp.GenerateNumber(); 
} 
,174,

#pragma once 
class Core 
{ public: int Run(); }; 

Core.h 왜 링커는 링크 3rdParty.lib을 필요로 하는가?

링커 빌드를 만들기위한 설정이 누락 되었습니까? MyRunnerCore.lib3rdParty.lib을 참조하지 않고 빌드 하시겠습니까?

+1

MSVC는 정적 라이브러리를 결합한 기능을 지원하지 않습니다. 명시 적으로 타사 라이브러리에 링크해야하며 라이브러리를 찾기 위해 링커에 설정된 경로에 있어야합니다. – drescherjm

답변

0

썼다 :

Librarian -> General -> Link Library Dependencies -> Yes 

가 올바른지. 그러나 다음을 사용하십시오.

#pragma comment (lib, ...) 

은 호환되지 않습니다.

라이브러리는 입력을 위해 tsandy하는

Librarian -> Additional Libraries -> 3rdParty.lib;%(AdditionalDependencies) 

감사를 사용하여 포함되어야한다.

1

링커는 파일 ThirdParyClass.lib을 찾을 수없는 것으로 보입니다. MyRunner의 프로젝트 설정에서이 파일이 들어있는 폴더를 Linker 아래의 Additional Library Directories에 추가합니다. tsandy으로

+1

예, 그렇습니다.하지만 링커는이 사실을 알 필요가 없습니다. Linker가 MyRunnerCore에 ThirdPartyClass.lib를 포함 시키길 원합니다.lib를 사용하여 MyRunner를 빌드 할 때 제공 할 필요가 없습니다. – Johannes

+0

제 생각에'코어'가 컴파일 될 때'ThirdPartyClass.lib'에서'ThirdPartyClass'의 구현을 실제로 복사하지 않습니다. 대신, "ThirdPartyClass의 구현을 위해,"ThirdPartyClass.lib'를 참조하는 자리 표시자를 남겨 둡니다. " 나는이 메커니즘을 해결할 수있는 어떠한 설정도 모르고있다. – tsandy

+0

이것은이 질문의 핵심입니다. 문서 링크가 있습니까? – Johannes