Visual Studio 에서 cURL 설치

윈도우에서 웹페이지와 통신할 때 WinHTTP 모듈을 쓰고 있었는데 이 모듈은 윈도우 전용이므로 리눅스에서는 사용이 불가능하다.

cURL 모듈을 사용할 수 있는지 테스트.

vcpkg로 cURL을 간단히 설치할 수 있었다.

그러나….

도저히 해결이 불가능했다. 구글과 스택오버플로우를 열심히 뒤졌으나 빌드플랫폼이 맞지 않아서 그럴거라는 의견뿐. x86 라이브러리와 x64 라이브러리를 모두 받아서 테스트 해봤으나 실패했다.

vcpkg에 대한 환상이 좀 깨졌다.

 

직접 받아서 빌드해보기로 했다.

cURL은 git 에서 소스 관리를 하고 있다.

cURL을 클론한다.

git clone https://github.com/curl/curl.git curl.git

다운 받은 폴더의 projects/Windows 폴더에 가면 Visual Studio 버전별로 쭉 있다. 난 2015이므로 VC12 선택.

curl-all.sln 솔루션 파일을 더블클릭하여 VS2015로 열어본다.

왜인지 모르겠는데 프로젝트 로드가 안된다. 프로젝트 파일이 없나 해당 위치에 가서 살펴봤는데…. 진짜로 프로젝트 파일이 없다!

 

어떻게 해야되나 고민하던 중에 project 폴더를 보니 여러개의 배치파일이 보였다. 일단 checksrc.bat 파일을 실행했다. 한참 아무메시지가 없더니만 프로그램이 종료되었다. 별 문제가 없으면 별 메시지를 출력하지 않나보다. (bat 파일 내용을 읽어보진 않았다.)

이제 왠지 프로젝트를 생성해줄 것 같은 generate.bat 파일을 실행했다. 예상대로…

D:\Library\curl.git\projects>checksrc.bat

D:\Library\curl.git\projects>generate.bat

Generating prerequisite files
* D:\Library\curl.git\Makefile
* D:\Library\curl.git\src\tool_hugehelp.c

Generating VC6 project files
* D:\Library\curl.git\projects\Windows\VC6\src\curl.dsp
* D:\Library\curl.git\projects\Windows\VC6\lib\libcurl.dsp

(...중략...)

Generating VC12 project files
* D:\Library\curl.git\projects\Windows\VC12\src\curl.vcxproj
* D:\Library\curl.git\projects\Windows\VC12\lib\libcurl.vcxproj

(...중략...)

D:\Library\curl.git\projects>

예상대로 프로젝트 파일을 생성해주었다.

이제 다시 아까 VC12 폴더로 가서 솔루션 파일을 여니까 프로젝트가 보인다! 솔루션 빌드를 눌렀더니….

 

…안된다…

 

1>d:\library\curl.git\lib\ssh.h(28): fatal error C1083: 포함 파일을 열 수 없습니다. 'libssh2.h': No such file or directory
1>..\..\..\..\lib\md5.c(88): fatal error C1083: 포함 파일을 열 수 없습니다. 'openssl/md5.h': No such file or directory
1>..\..\..\..\lib\md4.c(31): fatal error C1083: 포함 파일을 열 수 없습니다. 'openssl/opensslconf.h': No such file or directory

메시지가 쭉 박혀있었다.

다시 project 폴더에 가서 왠지 ssl 문제를 해결해줄 것 같은 build-openssl.bat 파일을 실행시키니 다음과 같은 안내가 나왔다.

D:\Library\curl.git\projects>build-openssl.bat

Usage: build-openssl <compiler> [platform] [configuration] [directory] [-VSpath] ["VSpath"] [-perlpath] ["perlpath"]

Compiler:

vc6       - Use Visual Studio 6
vc7       - Use Visual Studio .NET
vc7.1     - Use Visual Studio .NET 2003
vc8       - Use Visual Studio 2005
vc9       - Use Visual Studio 2008
vc10      - Use Visual Studio 2010
vc11      - Use Visual Studio 2012
vc12      - Use Visual Studio 2013
vc14      - Use Visual Studio 2015
vc14.1    - Use Visual Studio 2017

Platform:

x86       - Perform a 32-bit build
x64       - Perform a 64-bit build

Configuration:

debug     - Perform a debug build
release   - Perform a release build

Other:

directory - Specifies the OpenSSL source directory

-VSpath - Specify the custom VS path if Visual Studio is installed at other location
          then "C:/<ProgramFiles>/Microsoft Visual Studio[version]
          For e.g. -VSpath "C:\apps\MVS14"

-perlpath - Specify the custom perl root path if perl is not located at "C:\Perl" and it is a
            portable copy of perl and not installed on the win system
            For e.g. -perlpath "D:\strawberry-perl-5.24.3.1-64bit-portable"

D:\Library\curl.git\projects>

어렵구나…

OpenSSL을 같이 연동해줘야하는것 같은데 정녕 이 방법 밖에 없는 것인지 다시 생각해봤다.

 

다시 vcpkg를 쓰는 방법을 찾아본다.

 

많은 글들을 참고로 했다. ( http://bugsfixed.blogspot.com/2017/05/vcpkg.html )

이것저것 해보던 중. 갑자기 프로그램이 정상작동 되었다. -_-;;

설정은 프로젝트 설정에서 추가 포함 디렉토리로 include와 추가 라이브러리 디렉토리로 lib 디렉토리만 설정했고 다른 설정은 모두 삭제했다.

프로그램을 빌드해봤더니 바이너리 파일과 함께 libcurl.dll, zlib1.dll 파일이 자동으로 생성되었다. 이제 cURL을 테스트 해볼 차례.

 

<참고자료>

  • cURL 사용하여 웹페이지 긁어오기 : http://sobusted.cf/221485638633
    이 예제 중 fstream 관련하여 약간 문제가 있어 수정해서 사용했다.
  • libcurl 메뉴얼 : https://curl.haxx.se/libcurl/c/
  • 테스트 해봤던 프로젝트 : https://github.com/dongbum/CURLTest

Google Breakpad 설치 (2)

gyp 파일을 다 실행하고 나면 솔루션 파일과 프로젝트 파일 등이 생겨난다. 비주얼스튜디오로 솔루션 파일을 열어보면 다음과 같이 여러개의 프로젝트가 솔루션 안에 들어있다.

K-007

맨 밑에 build_all 프로젝트를 빌드해보면…

84개의 오류와 28개의 경고로 빌드가 안된다. 뭐 어차피 기대도 안했다.

에러메시지를 보면

#include "testing/gtest/include/gtest/gtest.h"
#include "testing/include/gmock/gmock.h"

이 부분에서부터 에러가 시작된다. gtest와 gmock이 필요하다고 한다. 이건 아마 외부라이브러리인 모양.

이 패키지들은 https://github.com/google/googletest 에서 받을 수 있다. 이 레포지토리를 git으로 클론한다. 다운로드 받으면 googlemock과 googletest다 들어있으며, 각 디렉토리에 msvc 라는 디렉토리가 있고 여기에 비주얼스튜디오로 열 수 있는 솔루션 파일과 프로젝트 파일들이 들어있다.

솔루션 파일들을 열어서 실행해보면 .lib 파일들이 생성된다. 이것들은 지금 당장은 필요 없다.

 

이제 이 파일들을 구조에 맞게 넣어줘야한다. 이걸 어떻게 해야하는지 몰라서 한참 찾았다.

https://github.com/Mendeley/breakpad

이 사람이 디렉토리 구조를 이미 만들어서 넣어놨길래 그대로 참고했다. (아마 이 사람은 브레이크패드에 맞도록 모든 라이브러리 파일을 다 넣어서 올려놓은듯하다. 이 소스를 받아다가 사용하면 잘될꺼 같기도하다.)

여기서부터 문제가 있는데, googlemock과 googletest 디렉토리를 구글브레이크패드 폴더에 복사해넣어줘야 한다. 그런데 내 경우에는, 회사컴퓨터에서 할 때와, 내 컴퓨터에서 했을 때 경로가 달랐다.

회사컴퓨터에서는… 구글 브레이크패드 디렉토리 중 src 디렉토리 밑에 testing 디렉토리를 만들고 거기에 googlemock 디렉토리 내용 전체를 복사해서 넣는다. 그리고 src/testing 디렉토리 밑에 gtest 디렉토리를 만들고 거기에는 googletest 디렉토리 내용 전체를 복사해서 넣는다.

집 컴퓨터에서는… 구글 브레이크 패드 디렉토리 중 src 디렉토리 밑에 testing 디렉토리를 만들고 거기에 googlemock과 googletest 디렉토리 두개를 그대로 복사해넣었다.

 

이제 구글 브레이크패드 솔루션 파일을 열고 build_all 프로젝트를 빌드해보면…

안된다.

 

오류가 난다. 오류내용은

C4091 'typedef ': 변수를 선언하지 않으면 '' 왼쪽은 무시됩니다.
C2220 경고가 오류로 처리되어 생성된 'object' 파일이 없습니다.

해당 코드는 다음과 같이 되어있다.

typedef enum {
    hdBase = 0, // root directory for dbghelp
    hdSym,      // where symbols are stored
    hdSrc,      // where source is stored
    hdMax       // end marker
};

enum인데 이름이 정의되지 않은 상태로 typedef가 되었기 때문에 나는 에러이다.

이걸 검색해보니 다음과 같은 내용을 찾았다.

https://stackoverflow.com/questions/913344/how-can-i-remove-the-vs-warning-c4091-typedef-ignored-on-left-of-spreadsh

typedef를 그냥 삭제해버리랜다. 삭제하려고 봤더니…

이 오류가 나는건, C:\Program Files (x86)\Windows Kits\8.1\Include\um\DbgHelp.h 파일이었다. C++ 라이브러리를 수정할 수는 없는 노릇… ‘프로젝트 속성’의 ‘구성 속성’ -> ‘C/C++’ -> ‘고급’을 찾아가 ‘특정 경고 사용 안 함’ 에 4091을 추가했다. 이제 빌드가 된다.

같은 에러가 나는 프로젝트를 찾아서 전부 위처럼 4091 에러에 대한 경고무시를 설정해줘야한다.

이렇게 또 build_all 을 해봤더니 또 오류가 난다.

프로젝트 중 unittests 에 있는 processor_bits 프로젝트가 계속 에러가 나는 것이었다. 경고를 전부 오류 처리해버리기에 빌드가 되지 않았다. 이것도 4091 에러처럼 4267, 4366 을 경고무시에 추가한다.

이제 다시 build_all 프로젝트를 빌드해본다.

또 오류가 난다.

unittest 에 있는 client_tests 프로젝트에서 에러가 났다. 마찬가지로 경고를 오류로 처리해서 나는 에러. 4389, 4312, 4267 을 경고무시로 넣어준다.

다시 build_all 프로젝트를 빌드해본다.

드디어 아무 에러 없이 성공.

이제 빌드된 구글브레이크패드를 이용해서 실제 사용하는 방법을 찾아봐야겠다.