2016-08-18 3 views
1

Crypto ++을 다운로드했으며이를 C++ Xcode 프로젝트에서 사용할 수 있도록 빌드하려고합니다.OS X Xcode 프로젝트 용 Crypto ++ 라이브러리

그냥 "make"명령을 사용하여 컴파일하고 내 xcode의 내 C++ 프로젝트에 libcryptopp.a을 포함 시켰습니다. 그러나 오류를주고있다 :

Undefined symbols for architecture i386: "CryptoPP::HashFilter::HashFilter(CryptoPP::HashTransformation&, 
CryptoPP::BufferedTransformation*, bool, int, std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&)", referenced from: 
... 
+0

기본 메이크업은'-march = native' 옵션을 구축 할 것 이는 x86_64 바이너리로 이어진다. – halfelf

+0

그럼 어떻게해야합니까? @halfelf –

+0

Common Crypto를 사용하지 않는 이유는 모든 "C"코드이며 하드웨어 지원을위한 최적화가 있습니다. – zaph

답변

1

I compiled using just "make" command and included libcryptopp.a in my c++ project of my xcode. But it is giving errors ...

@halfelf 말했듯이, 당신은 그 엑스 코드가 사용하는 것 때문에 LLVM의 런타임 (libc++)를 사용합니다. 보유하고있는 Crypto ++ 버전에 따라 GNU 런타임 (libstdc++)을 사용하고있을 수도 있고 사용하지 않을 수도 있습니다.

이 문제를 해결하는 가장 쉬운 방법은 Master Checkout입니다. 마스터가 정상적으로 작동하기 때문에 마스터에서 정상적으로 작동하며 가끔씩 중단됩니다 (대부분의 개발은 별도의 지점에서 이루어짐). 암호화 ++의 이전 버전을 준수하지 않았기 때문에 마스터를 사용

$ git clone https://github.com/weidai11/cryptopp 
Cloning into 'cryptopp'... 
remote: Counting objects: 9116, done. 
remote: Total 9116 (delta 0), reused 0 (delta 0), pack-reused 9116 
Receiving objects: 100% (9116/9116), 8.05 MiB | 6.53 MiB/s, done. 
Resolving deltas: 100% (6406/6406), done. 
Checking connectivity... done. 

가 필요합니다 사용자의 CXXCXXFLAGS. 당신은 그것을 수정하기 위해 메이크 파일을 편집해야만했다.

그런 다음, 다음을 수행하십시오

당신은 디버그/릴리즈 빌드, 기호 수준 및 최적화 레벨을 설정해야
export CXXFLAGS="-DNDEBUG -g2 -O2 -stdlib=libc++" 
$ CXX=clang++ make -j 4 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -fPIC -march=native -pipe -c cryptlib.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -fPIC -march=native -pipe -c cpu.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -fPIC -march=native -pipe -c shacal2.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -fPIC -march=native -pipe -c md5.cpp 
... 

. makefile은 나머지 플래그를 추가합니다.

-stdlib=libc++ 만 추가되었으므로 일부 손을 포기하고 있습니다. 가장 문제가없는 링크를 보장하기 위해 Xcode에서 사용하는 CXXFLAGS을 사용해야합니다. 다른 CXXFLAGS을 사용하면 수년 동안 많은 문제가 발생했습니다. 당신이 다음을 수행 할 수 있어야하므로


암호화 ++는 지방 바이너리 안전 (unlike cURL and OpenSSL)입니다. 사실, 당신을 위해 상자 밖으로 작동해야하므로, our test script tests this class of configurations (C++ (17)를 통해 C++ 03을 포함하여 인텔과 PPC 지방 바이너리) :

export CXXFLAGS="-DNDEBUG -g2 -O2 -stdlib=libc++ -arch i386 -arch x86_64" 
$ CXX=clang++ make -j 4 
$ make -j 4 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -arch i386 -arch x86_64 -fPIC -march=native -pipe -c cryptlib.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -arch i386 -arch x86_64 -fPIC -march=native -pipe -c cpu.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -arch i386 -arch x86_64 -fPIC -march=native -pipe -c shacal2.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -arch i386 -arch x86_64 -fPIC -march=native -pipe -c md5.cpp 
... 

Undefined symbols for architecture i386을 피할 두 아키텍처를 사용하고 Undefined symbols for architecture x86_64.


여기에는 관련 Crypto ++ wiki 페이지가 있지만 iOS 및 OS X 용입니다. 대부분 적용되지만 정확하게는 아닙니다. IOS (Xcode)

  • IOS (Command Line)
    • 다음은 명령 줄에서 라이브러리 구축에 위키 기사입니다.당신은 실제로"컴파일러와 C++ 런타임"에서 논의 된 고통의 지점을 타격,하지만 명백하지 않을 :

    +0

    빌드 오류가 발생합니다. –

    +0

    @ user7234 - 새 질문을 열고 자세한 정보를 제공하십시오. – jww

    +0

    clang ++ -DNDEBUG -g2 -O2 -stdlib = libC++ -arch i386 -arch x86_64 -fPIC -march = native -pipe -c camellia.cpp cpu.cpp : 104 : 4 : 오류 : 레지스터 % rbx는 64 개에서만 사용할 수 있습니다. 비트 모드 "pushq %% rbx; cpuid; mov %% ebx, %% edi; popq %% rbx" : 1 : 8 : 참고로 여기에 어셈블리로 인스턴스화 됨 pushq % rbx; cpuid; mov % ebx, % edi; popq % rbx ^ ~~~~ cpu.cpp : 104 : 4 : 오류 : 레지스터 % rbx는 64 비트 모드에서만 사용할 수 있습니다. "pushq %% rbx; cpuid; mov %% ebx, %% edi; popq %% rbx " –