title: MinGW/libssl Linking Errors
body: <p>I am porting an application that I developed in Linux to Windows and am having some issues when building the application.  After making the necessary code changes, everything compiles fine (and when built as a debug build in Visual Studio, runs without any issues).  I need to build this in MinGW, and I'm having linker errors when I try to link it against liboauth, which is also required for my project.  </p>
  
  <p>The command and its output are as follows:</p>
  
  <pre><code>gcc application.o service.o util.o json.o api.o -L/usr/local/lib -lcrypto -lssl -lcurl -ljansson -loauth -Wl -o application
  
  C:/MinGW/msys/1.0/local/lib/liboauth.a(liboauth_la-hash.o): In function `oauth_sign_hmac_sha1_raw':
  c:\lib\liboauth-0.9.4\src/hash.c:314: undefined reference to `EVP_sha1'
  c:\lib\liboauth-0.9.4\src/hash.c:314: undefined reference to `HMAC'
  C:/MinGW/msys/1.0/local/lib/liboauth.a(liboauth_la-hash.o): In function `oauth_sign_rsa_sha1':
  c:\lib\liboauth-0.9.4\src/hash.c:334: undefined reference to `BIO_new_mem_buf'
  c:\lib\liboauth-0.9.4\src/hash.c:335: undefined reference to `PEM_read_bio_PrivateKey'
  c:\lib\liboauth-0.9.4\src/hash.c:336: undefined reference to `BIO_free'
  c:\lib\liboauth-0.9.4\src/hash.c:343: undefined reference to `EVP_PKEY_size'
  c:\lib\liboauth-0.9.4\src/hash.c:346: undefined reference to `EVP_sha1'
  c:\lib\liboauth-0.9.4\src/hash.c:346: undefined reference to `EVP_DigestInit'
  c:\lib\liboauth-0.9.4\src/hash.c:347: undefined reference to `EVP_DigestUpdate'
  c:\lib\liboauth-0.9.4\src/hash.c:348: undefined reference to `EVP_SignFinal'
  c:\lib\liboauth-0.9.4\src/hash.c:352: undefined reference to `CRYPTO_free'
  c:\lib\liboauth-0.9.4\src/hash.c:353: undefined reference to `EVP_PKEY_free'
  C:/MinGW/msys/1.0/local/lib/liboauth.a(liboauth_la-hash.o): In function `oauth_verify_rsa_sha1':
  c:\lib\liboauth-0.9.4\src/hash.c:367: undefined reference to `BIO_new_mem_buf'
  c:\lib\liboauth-0.9.4\src/hash.c:368: undefined reference to `PEM_read_bio_X509'
  c:\lib\liboauth-0.9.4\src/hash.c:370: undefined reference to `X509_get_pubkey'
  c:\lib\liboauth-0.9.4\src/hash.c:371: undefined reference to `X509_free'
  c:\lib\liboauth-0.9.4\src/hash.c:375: undefined reference to `BIO_free'
  c:\lib\liboauth-0.9.4\src/hash.c:384: undefined reference to `EVP_sha1'
  c:\lib\liboauth-0.9.4\src/hash.c:384: undefined reference to `EVP_DigestInit'
  c:\lib\liboauth-0.9.4\src/hash.c:385: undefined reference to `EVP_DigestUpdate'
  c:\lib\liboauth-0.9.4\src/hash.c:386: undefined reference to `EVP_VerifyFinal'
  c:\lib\liboauth-0.9.4\src/hash.c:387: undefined reference to `EVP_MD_CTX_cleanup'
  c:\lib\liboauth-0.9.4\src/hash.c:388: undefined reference to `EVP_PKEY_free'
  c:\lib\liboauth-0.9.4\src/hash.c:373: undefined reference to `PEM_read_bio_PUBKEY'
  C:/MinGW/msys/1.0/local/lib/liboauth.a(liboauth_la-hash.o): In function `oauth_body_hash_file':
  c:\lib\liboauth-0.9.4\src/hash.c:405: undefined reference to `EVP_MD_CTX_init'
  c:\lib\liboauth-0.9.4\src/hash.c:406: undefined reference to `EVP_sha1'
  c:\lib\liboauth-0.9.4\src/hash.c:406: undefined reference to `EVP_DigestInit'
  c:\lib\liboauth-0.9.4\src/hash.c:408: undefined reference to `EVP_DigestUpdate'
  c:\lib\liboauth-0.9.4\src/hash.c:412: undefined reference to `EVP_sha1'
  c:\lib\liboauth-0.9.4\src/hash.c:412: undefined reference to `EVP_MD_size'
  c:\lib\liboauth-0.9.4\src/hash.c:413: undefined reference to `EVP_DigestFinal'
  c:\lib\liboauth-0.9.4\src/hash.c:414: undefined reference to `EVP_MD_CTX_cleanup'
  C:/MinGW/msys/1.0/local/lib/liboauth.a(liboauth_la-hash.o): In function `oauth_body_hash_data':
  c:\lib\liboauth-0.9.4\src/hash.c:422: undefined reference to `EVP_sha1'
  c:\lib\liboauth-0.9.4\src/hash.c:422: undefined reference to `EVP_MD_size'
  c:\lib\liboauth-0.9.4\src/hash.c:423: undefined reference to `EVP_MD_CTX_init'
  c:\lib\liboauth-0.9.4\src/hash.c:424: undefined reference to `EVP_sha1'
  c:\lib\liboauth-0.9.4\src/hash.c:424: undefined reference to `EVP_DigestInit'
  c:\lib\liboauth-0.9.4\src/hash.c:425: undefined reference to `EVP_DigestUpdate'
  c:\lib\liboauth-0.9.4\src/hash.c:426: undefined reference to `EVP_DigestFinal'
  c:\lib\liboauth-0.9.4\src/hash.c:427: undefined reference to `EVP_MD_CTX_cleanup'
  collect2: ld returned 1 exit status
  make: *** [montools] Error 1
  </code></pre>
  
  <p>I have all of the required libraries in the lib path, and for some reason liboauth just cannot find the references to libssl and libcrypto. This all builds fine in Linux.  Any ideas?</p>
  
  <p><strong>Update</strong></p>
  
  <p>Based on responses, I have updated my linker command so as to link the libraries in a different order.  My new command is as follows:</p>
  
  <pre><code>gcc -o application application.o service.o util.o json.o api.o -Lc:/mingw/msys/1.0/local/lib -loauth -ljansson -lcurl -lssl -lcrypto
  </code></pre>
  
  <p>This fixes this previous problem and presents a new set of linker errors:</p>
  
  <pre><code>gcc -o application application.o service.o util.o json.o api.o -Lc:/mingw/msys/1.0/local/lib -loauth -ljansson -lcurl -lssl -lcrypto 
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0xee0): undefined reference to `CreateDCA@16'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0xeef): undefined reference to `CreateCompatibleDC@4'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0xf08): undefined reference to `GetDeviceCaps@8'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0xf23): undefined reference to `GetDeviceCaps@8'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0xf44): undefined reference to `CreateCompatibleBitmap@12'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0xf5b): undefined reference to `SelectObject@8'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0xf7e): undefined reference to `GetObjectA@12'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0x1024): undefined reference to `BitBlt@36'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0x103b): undefined reference to `GetBitmapBits@12'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0x10b0): undefined reference to `SelectObject@8'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0x10bb): undefined reference to `DeleteObject@4'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0x10c8): undefined reference to `DeleteDC@4'
  c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libcrypto.a(rand_win.o):rand_win.c:(.text+0x10d5): undefined reference to `DeleteDC@4'
  collect2: ld returned 1 exit status
  make: *** [montools] Error 1
  </code></pre>
  
  <p>A quick google search returned that I should also link in the gdi32 library (for purposes unrelated to my tasks.  The final command for the linker is then as follows:</p>
  
  <pre><code>gcc -o application application.o service.o util.o json.o api.o -Lc:/mingw/msys/1.0/local/lib -loauth -ljansson -lcurl -lssl -lcrypto -lgdi32
  </code></pre>