[C++][libcurl][windows] visualstudio libcurl 빌드하기

windows 환경 visual studio 2019 에서 github 소스 를 받아 로컬 static 빌드

> git clone https://github.com/curl/curl.git
> cd curl
> .\buildconf.bat
Generating prerequisite files
* E:\github\curl\Makefile
* E:\github\curl\src\tool_hugehelp.c

Warning: The curl manual could not be integrated in the source. This means when
you build curl the manual will not be available (curl --man). Integration of
the manual is not required and a summary of the options will still be available
(curl --help). To integrate the manual your PATH is required to have
groff/nroff, perl and optionally gzip for compression.

git clone 을 받은 뒤 해당 폴더에서 buildconf.bat 을 실행한다
이는 위에 확인되는 tool_hugehelp.c 를 받아 두기 위함이다
해당 파일은 이후 빌드중 이 과정이 없을 시 아래와 같은 오류 가 발생하게 된다

Microsoft (R) Library Manager Version 14.29.30037.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Copying libs...
NMAKE : fatal error U1073: '..\src\tool_hugehelp.c'을(를) 만드는 방법을 모릅니다.
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\bin\HostX64\x64\nmake.exe"' : '0x2' 반환 코드입니다.
Stop.

이후 윈도우 검색등을 이용하면 “x64 Native Tools Command Prompt for VS 2019” 를 찾아 실행 할 수 있다
환경변수등을 통해 nmake.exe 가 실행가능하다면 위 터미널 환경에서 계속 진행 가능하다
(이는 nmake 를 실행하기 위해서 이다)

이 프롬프트에서 계속 빌드를 진행한다

> Set RTLIBCFG=static
> cd curl/winbuild
> nmake /f MakeFile.vc mode=static vc=16

static 으로 빌드하겠다는 환경변수를 추가
curl 을 받은 폴더내의 winbuild 로 이동한뒤
위와같은 명령을 vs 버전에 맞게 줄 경우 빌드가 진행 된다


├─libcurl-vc16-x64-release-static-ipv6-sspi-schannel
│ ├─bin
│ ├─include
│ │ └─curl
│ └─lib
├─libcurl-vc16-x64-release-static-ipv6-sspi-schannel-obj-curl
└─libcurl-vc16-x64-release-static-ipv6-sspi-schannel-obj-lib
├─vauth
├─vquic
├─vssh
└─vtls

builds 하위에 이와 같은 경로로 파일들이 생성되면 빌드가 정상적으로 이루어진것

프로젝트에 라이브러리 링크,사용

libcurl-vc16-x64-release-static-ipv6-sspi-schannel 폴더를 사용하게 된다
상위 폴더의 bin 폴더에 curl.exe
include 폴더를 실제 프로젝트의 참조 헤더파일 폴더로 지정
lib 폴더를 추가 라이브러리 디렉터리 로 추가하면 된다

전처리기로 CURL_STATICLIB 또는 디버깅에서는 DCURL_STATICLIB 를 추가해줘야 내부 헤더에서의 코드가 static 코드로 사용하게 된다

이때 우리는 빌드를 static MT 로 하였으므로 실제 프로젝트를 아키텍쳐/debug or release/MT or MTd
에 맞게 설정하여야 하며

이후 빌드 및 관련 라이브러리 에러들은

#include <curl/curl.h>
#include <Winsock2.h>

#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "CRYPT32.lib")
#pragma comment(lib, "Normaliz.lib")

위 내용과 같이 include / lib link 가 필요할 수 있다

각 에러들에 따라 필요한 라이브러리가 다르기에 실제 적용시 각 에러에 맞는 필요한 라이브러리를 추가 하길 바란다
각 에러별 필요한 라이브러리들은 아래 추가로 기술한다

pragma comment(lib, “wldap32.lib”)

1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_init
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_sslinit
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_unbind_s
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_set_option
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_simple_bind_s
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_bind_s
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_search_s
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_msgfree
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_err2string
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_first_entry
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_next_entry
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_first_attribute
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_next_attribute
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_get_values_len
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_value_free_len
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_get_dn
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ldap_memfree
1>libcurl_a.lib(ldap.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ber_free

#include <Winsock2.h>
pragma comment(lib, “Ws2_32.lib”)

1>libcurl_a.lib(multi.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_send
1>libcurl_a.lib(asyn-thread.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_send
1>libcurl_a.lib(sendf.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_send
1>libcurl_a.lib(telnet.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_send
1>libcurl_a.lib(multi.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSACloseEvent
1>libcurl_a.lib(telnet.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSACloseEvent
1>libcurl_a.lib(multi.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSACreateEvent
1>libcurl_a.lib(telnet.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSACreateEvent
1>libcurl_a.lib(multi.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAEnumNetworkEvents
1>libcurl_a.lib(telnet.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAEnumNetworkEvents
1>libcurl_a.lib(multi.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAEventSelect
1>libcurl_a.lib(telnet.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAEventSelect
1>libcurl_a.lib(multi.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAResetEvent
1>libcurl_a.lib(multi.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSASetEvent
1>libcurl_a.lib(multi.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAWaitForMultipleEvents
1>libcurl_a.lib(asyn-thread.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_closesocket
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_closesocket
1>libcurl_a.lib(hostip.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_closesocket
1>libcurl_a.lib(socketpair.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_closesocket
1>libcurl_a.lib(ftp.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAGetLastError
1>libcurl_a.lib(telnet.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAGetLastError
1>libcurl_a.lib(tftp.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAGetLastError
1>libcurl_a.lib(asyn-thread.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAGetLastError
1>libcurl_a.lib(sendf.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAGetLastError
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAGetLastError
1>libcurl_a.lib(schannel.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAGetLastError
1>libcurl_a.lib(sendf.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_recv
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_recv
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_bind
1>libcurl_a.lib(socketpair.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_bind
1>libcurl_a.lib(ftp.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_bind
1>libcurl_a.lib(tftp.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_bind
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_connect
1>libcurl_a.lib(socketpair.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_connect
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_getpeername
1>libcurl_a.lib(socketpair.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_getpeername
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_getsockname
1>libcurl_a.lib(socketpair.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_getsockname
1>libcurl_a.lib(ftp.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_getsockname
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_getsockopt
1>libcurl_a.lib(smb.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_htons
1>libcurl_a.lib(telnet.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_htons
1>libcurl_a.lib(doh.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_htons
1>libcurl_a.lib(socks_sspi.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_htons
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_htons
1>libcurl_a.lib(hostip.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_htons
1>libcurl_a.lib(curl_addrinfo.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_htons
1>libcurl_a.lib(ftp.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_htons
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ntohs
1>libcurl_a.lib(ftp.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ntohs
1>libcurl_a.lib(socks_sspi.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ntohs
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_setsockopt
1>libcurl_a.lib(transfer.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_setsockopt
1>libcurl_a.lib(socketpair.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_setsockopt
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_socket
1>libcurl_a.lib(hostip.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_socket
1>libcurl_a.lib(socketpair.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_socket
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSASetLastError
1>libcurl_a.lib(select.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSASetLastError
1>libcurl_a.lib(curl_addrinfo.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSASetLastError
1>libcurl_a.lib(connect.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAIoctl
1>libcurl_a.lib(transfer.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAIoctl
1>libcurl_a.lib(system_win32.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSAStartup
1>libcurl_a.lib(system_win32.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_WSACleanup
1>libcurl_a.lib(select.obj) : error LNK2001: 확인할 수 없는 외부 기호 __WSAFDIsSet
1>libcurl_a.lib(select.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_select
1>libcurl_a.lib(socketpair.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_accept
1>libcurl_a.lib(ftp.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_accept
1>libcurl_a.lib(socketpair.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_htonl
1>libcurl_a.lib(socketpair.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_listen
1>libcurl_a.lib(ftp.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_listen
1>libcurl_a.lib(curl_addrinfo.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_getaddrinfo
1>libcurl_a.lib(curl_addrinfo.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_freeaddrinfo
1>libcurl_a.lib(tftp.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_recvfrom
1>libcurl_a.lib(tftp.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_sendto
1>libcurl_a.lib(nonblock.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_ioctlsocket
1>libcurl_a.lib(curl_gethostname.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_gethostname

pragma comment(lib, “CRYPT32.lib”)

1>libcurl_a.lib(schannel.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertOpenStore
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertOpenStore
1>libcurl_a.lib(schannel.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertCloseStore
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertCloseStore
1>libcurl_a.lib(schannel.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertEnumCertificatesInStore
1>libcurl_a.lib(schannel.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertFindCertificateInStore
1>libcurl_a.lib(schannel.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertFreeCertificateContext
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertFreeCertificateContext
1>libcurl_a.lib(schannel.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CryptStringToBinaryA
1>libcurl_a.lib(schannel.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_PFXImportCertStore
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CryptDecodeObjectEx
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertAddCertificateContextToStore
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertFindExtension
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertGetNameStringA
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CryptQueryObject
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertCreateCertificateChainEngine
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertFreeCertificateChainEngine
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertGetCertificateChain
1>libcurl_a.lib(schannel_verify.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_CertFreeCertificateChain

pragma comment(lib, “Normaliz.lib”)

1>libcurl_a.lib(idn_win32.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_IdnToAscii
1>libcurl_a.lib(idn_win32.obj) : error LNK2001: 확인할 수 없는 외부 기호 __imp_IdnToUnicode


댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다