2010-03-24 6 views
2

내 정적 라이브러리를 만들려고합니다. 그러나 제 3 자 정적 라이브러리도 사용하고 있습니다. 자, 내 정적 라이브러리에 나는 클라이언트 API가있는 .h 파일을 가지고있다. 모든 구현 세부 사항은 .cpp 파일에 있습니다. 거기에는 문제가 없습니다. 그러나 .cpp 파일의 일부 기능은이 제 3 자 lib에 의존합니다.정적 라이브러리 Visual Studio 2008

제 3 자 정적 라이브러리를 설치하도록 요청할 수 없으며 어떻게 든 제 정적 라이브러리에 포함해야합니다. 내가 취한 조치 중 일부는 다음과 같습니다.

  1. 정적 라이브러리 프로젝트에 포함 시켰습니다. 그것은 지금까지 대 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 개 ==== ======

    로그가 너무 커서 공유 할 수는 없지만 이렇게해야합니다. 여기에 첨부 파일을 사용하는 방법이없는 한 방법을 잘 모르겠지만 문제를 나타내기에 충분해야합니다.

  • +0

    dll로 라이브러리를 배포하고 정적 타사 라이브러리를 라이브러리로 연결할 수없는 특별한 이유가 있습니까? –

    +0

    요구 사항으로 나는 그것을 dll로 배포 할 수 없습니다. 그것은 정적 lib이어야합니다. 나는 그 부분에 대한 통제권이 없다. –

    +0

    업데이트 - 정적 라이브러리를 작성하는 경우 연결이 이루어지지 않습니다. Ergo, 프로젝트에 정적 라이브러리가 없습니다. 또한 IDE를 사용하여 모든 것이 잘 수행되는 것은 아닙니다. 명령 행 프롬프트 사용을 고려하십시오. –

    답변

    2

    정적 라이브러리는 실행 파일이나 DLL을 빌드 할 때만 링크되며, 정적 라이브러리 자체를 만들 때 링크되지 않습니다. 두 개의 정적 라이브러리를 연결하려면 lib.exe 도구가 다음을 수행해야합니다. 그러나 최종 프로 젝츠에 2 개 (또는 그 이상)의 정적 라이브러리를 가지고 살 수없는 이유는 모르겠다.

    +0

    아주 까다 롭지 만 특별한 이유가 언급되지 않았습니다. 나는 그 문제에 대해 정말로 아무 말도하지 않는다. 나는 그들에게 그들의 응용 프로그램과 함께 사용할 하나의 lib를 제공하기 만하면됩니다. 이 시점에서 그 이외의 것은 허용되지 않습니다. 그래서 그것은 하나의 정적 라이브러리에 여러 개의 obj를 포함 시키거나 vs2008이 사서 옵션을 허용하는 것으로 보이는 의존성을 가진 정적 라이브러리를 생성하는 방법에 대한 연구로 이어졌습니다. 나는 단지 내가 lib를 만들었을 때 내가 필요로하는 obj를 추출하고 넣을 수 있을까? 네가 닐에게 뺏기고있는 선택 사항인가? –

    +0

    @ user300938 예, lib를 사용하여 정적 라이브러리를 분리 할 수도 있고, 말했듯이 함께 결합 할 수도 있습니다. 하지만 제 3 자 라이브러리를 사용하기 전에 저작권 및 기타 법적 문제를 확실히 알고 싶습니다. –

    +0

    흠 나는 그 닐을 들여다 보았다. cryptopp 오픈 소스를 사용하고 있습니다. 내가 수집 한 것부터는 .lib 전체를 내보낼 수 없다는 것입니다. 그러나 저작권에 대해 걱정하지 않고 사용할 수있는 개별 파일입니다. 퍼블릭 도메인 인 개별 항목이 아닌 전체적으로 컴파일 된 라이브러리를 적용하는 저작권. 따라서 어쨌든 전체 라이브러리를 사용할 수 없습니다. 유일한 방법은 lib.exe를 통해 사용하고있는 indiviual obj를 얻고이를 lib에 넣는 것입니다. 그래도 고마워. 나는 그것이 오픈 소스라는 것을 알고 있었다. 그러나 그것에 부착 된 어떤 조건들을 가지고 있었다. –