내 정적 라이브러리를 만들려고합니다. 그러나 제 3 자 정적 라이브러리도 사용하고 있습니다. 자, 내 정적 라이브러리에 나는 클라이언트 API가있는 .h 파일을 가지고있다. 모든 구현 세부 사항은 .cpp 파일에 있습니다. 거기에는 문제가 없습니다. 그러나 .cpp 파일의 일부 기능은이 제 3 자 lib에 의존합니다.정적 라이브러리 Visual Studio 2008
제 3 자 정적 라이브러리를 설치하도록 요청할 수 없으며 어떻게 든 제 정적 라이브러리에 포함해야합니다. 내가 취한 조치 중 일부는 다음과 같습니다.
- 정적 라이브러리 프로젝트에 포함 시켰습니다. 그것은 지금까지 대 2008 년
에 너무 좋은 그것을 선택할 수 있도록
그러나 라이브러리를 만들려고 할 때 LNK4006 경고뿐만 아니라 LNK4221이 표시되는 것 같습니다. 이것들은 모두 제 3 자의 obj 파일과 관련이 있습니다. LNK4006의 경우 다른 클래스에 대해 여러 함수 선언이 표시되며 두 번째 정의는 무시됩니다. LNK4221의 경우, 내가 부르고있는 함수 중 해당 obj를 사용하지 않으므로 결코 사용되지 않을 것입니다.
그래서 이러한 경고를 없애려면 어떻게해야합니까? 제 3 자 정적 라이브러리를 사용하고 있고 제 고유 testapp가 함께 작동한다는 것을 압니다. 여기에있는 질문은 정적 라이브러리를 제공하는 것입니다.
추가 연구에 따르면 기존 정적 라이브러리 내에 여러 정적 라이브러리를 사용하는 사람들이 있다는 것을 알 수 있습니다. 그러나 현재로서는 어떻게 진행해야할지 모르겠습니다. lib에있는 모든 obj에 대해 모든 경고를 생성하는 것처럼 보입니다.
아마 내가 사용하고있는 obj를 분리 할 필요가 있습니다.
그러나 이것들은 단지 몇 가지 생각입니다. 도움이 필요한 사람이 있다면 감사하게 생각합니다. 나는 매우 비슷한 비슷한 글을 이곳에서 찾았지만, 나에게 적합한 솔루션이 아닌 것 같다.
희망이 명확하고 정확합니다.
뭐죠 거기에 구글과
업데이트 MSDN
를 통해보고 후 : 난 그냥 단순히컴파일을 VS2008하기 위해 타사 lib 디렉토리를 추가 할 때 다음 링커 관련 경고 메시지의 일부를했다 ... 1> TFLib.cpp 1> 라이브러리 만들기 ... 1> cryptlib.lib (pch.obj) : 경고 LNK4221 : 공개 기호가 없습니다. (3way.obj) : cryptlib.lib (3way.obj)에 이미 정의 된 "void __cdecl CryptoPP :: ThreeWay_TestInstantiations (void)"(? ThreeWay_TestInstantiations @ CryptoPP @@ YAXXZ)); 두 번째 정의가 무시되었습니다. 1> cryptlib.lib (3way.obj) : 경고 LNK4006 : "public : 가상 void __thiscall CryptoPP :: ThreeWay :: Base :: UncheckedSetKey (부호없는 char const *, 부호없는 int, 클래스 CryptoPP :: NameValuePairs const &) "cryptlib.lib (3way.obj)에 이미 정의 된 (? UncheckedSetKey @ Base @ ThreeWay @ CryptoPP @@ UAEXPBEIABVNameValuePairs @ 3 @@ Z); 두 번째 정의가 무시되었습니다. 1> cryptlib.lib (3way.obj) : 경고 LNK4006 : "public : 가상 void __thiscall CryptoPP :: ThreeWay :: Enc :: ProcessAndXorBlock (부호없는 char const *, 부호없는 char const *, 부호없는 char *) const "(?ProcessAndXorBlock @ Enc @ ThreeWay @ CryptoPP @@ UBEXPBE0PAE @ Z) cryptlib.lib (3way.obj)에 이미 정의되어 있습니다. 두 번째 정의가 무시되었습니다. 경고 : LNK4006 경고 : Cryptlib.lib (3way.obj) "(? ProcessAndXorBlock @ Dec @ ThreeWay @ CryptoPP @@ UBEXPBE0PAE @ Z) cryptlib.lib (3way.obj)에 이미 정의되어 있습니다. 두 번째 정의가 무시되었습니다. 1> cryptlib.lib (3way.obj) : 경고 LNK4221 : 공개 기호가 없습니다. 아카이브 멤버에 액세스 할 수 없습니다. 1> cryptlib.lib (adler32.obj) : 경고 LNK4006 : "public : virtual void __thiscall CryptoPP :: Adler32 :: Update (서명되지 않은 char const *, 부호없는 int)"(업데이트 @ Adler32 @ CryptoPP @@ UAEXPBEI @ Z) 이미 cryptlib.lib (adler32.obj)에 정의되어 있습니다. 두 번째 정의가 무시되었습니다. 1> cryptlib.lib (adler32.obj) : 경고 LNK4006 : "public : 가상 void __thiscall CryptoPP :: Adler32 :: TruncatedFinal (부호없는 char *, 부호없는 int)"(TruncatedFinal @ Adler32 @ CryptoPP @@ UAEXPAEI @Z) 이미 cryptlib.lib (adler32.obj)에 정의되어 있습니다. 두 번째 정의가 무시되었습니다. 1> cryptlib.lib (adler32.obj) : 경고 LNK4221 : 공개 기호가 없습니다. 아카이브 멤버는 액세스 할 수 없습니다. 1> cryptlib.lib (algparam.obj) : 경고 LNK4006 : "public : virtual bool __thiscall CryptoPP :: CombinedNameValuePairs :: GetVoidValue (char const *, 클래스 type_info const &, void *) const" GetVoidValue @ CombinedNameValuePairs @ CryptoPP @@ UBE_NPBDABVtype_info @@ PAX @ Z) 이미 cryptlib.lib (algparam.obj)에 정의되어 있습니다. 두 번째 정의가 무시되었습니다. 1> cryptlib.lib (algparam.obj) : 경고 LNK4006 : "보호 : void __thiscall CryptoPP :: AlgorithmParametersBase :: operator = (클래스 CryptoPP :: AlgorithmParametersBase const &)"(?? 4AlgorithmParametersBase @ CryptoPP @@ IAEXABV01 @@ Z) 이미 cryptlib.lib (algparam.obj)에 정의되어 있습니다. 두 번째 정의가 무시되었습니다. 경고 : LNK4006 경고 : "public : bool __thiscall @ CryptoPP @@ QBE_NPBDABVtype_info @@ PAX @ Z) 이미 cryptlib.lib (algparam.obj)에 정의되어 있습니다. 두 번째 정의는 무시 됨 : cryptlib.lib (algparam.obj) : 경고 LNK4006 : cryptlib에 이미 정의 된 "public : __thiscall CryptoPP :: AlgorithmParameters :: AlgorithmParameters (void)"(0AlgorithmParameters @ CryptoPP @@ QAE @ XZ). lib (algparam.obj); 두 번째 정의가 무시되었습니다.1> cryptlib.lib (algparam.obj) : 경고 LNK4006 : "public : __thiscall CryptoPP :: AlgorithmParameters :: AlgorithmParameters (클래스 CryptoPP :: AlgorithmParameters const &)"(0AlgorithmParameters @ CryptoPP @@ QAE @ ABV01 @@ Z) 이미 cryptlib.lib (algparam.obj)에 정의되어 있습니다. 두 번째 정의가 무시되었습니다. 1> cryptlib.lib (algparam.obj) : 경고 LNK4006 : 경고 : CryptoPP :: AlgorithmParameters 클래스 & @ CryptoPP @@ QAEAAV01 @ ABV01 @@ Z) 이미 cryptlib.lib (algparam.obj)에 정의되어 있습니다. 두 번째 정의가 무시되었습니다. 1> cryptlib.lib (algparam.obj) : 경고 LNK4006 : "public : 가상 bool __thiscall CryptoPP :: AlgorithmParameters :: GetVoidValue (char const *, 클래스 type_info const &, void ) const"(? GetVoidValue @ AlgorithmParameters @ CryptoPP @@ UBE_NPBDABVtype_info @@ PAX @ Z) 이미 cryptlib.lib (algparam.obj)에 정의되어 있습니다. 무시 두 번째 정의 1> cryptlib.lib (algparam.obj) : LNK4006 경고 : "부울을 (const를 &있는 type_info 클래스, 무효 * 무효 CONST *) ( CryptoPP :: g_pAssignIntToInteger __cdecl)"(g_pAssignIntToInteger @ CryptoPP @@ 3P6A_NABVtype_info @@ PAXPBX @ ZA) 이미 cryptlib.lib (algparam.obj)에 정의되어 있습니다. 두 번째 정의가 무시되었습니다. 1> cryptlib.lib (algparam.obj) : 경고 LNK4221 : 공개 기호가 없습니다. // D : 아카이브 멤버
과 끝에
...1> 파일 "에 저장된 로그를 구축 액세스 할 수 없습니다 \ 문서 및 설정 \ Khurram은 \ 내 문서 비주얼 스튜디오 2008 \ \ 프로젝트 \ TFLib \ TFLib \ Debug \ BuildLog.htm " 1 TFLib - 0 오류 1354 경고 빌드 : 성공 1 개, 실패 0 개, 최신 0 개, 생략 0 개 ==== ======
로그가 너무 커서 공유 할 수는 없지만 이렇게해야합니다. 여기에 첨부 파일을 사용하는 방법이없는 한 방법을 잘 모르겠지만 문제를 나타내기에 충분해야합니다.
dll로 라이브러리를 배포하고 정적 타사 라이브러리를 라이브러리로 연결할 수없는 특별한 이유가 있습니까? –
요구 사항으로 나는 그것을 dll로 배포 할 수 없습니다. 그것은 정적 lib이어야합니다. 나는 그 부분에 대한 통제권이 없다. –
업데이트 - 정적 라이브러리를 작성하는 경우 연결이 이루어지지 않습니다. Ergo, 프로젝트에 정적 라이브러리가 없습니다. 또한 IDE를 사용하여 모든 것이 잘 수행되는 것은 아닙니다. 명령 행 프롬프트 사용을 고려하십시오. –