[RESOLVIDO] Erro ao compilar DLL: error LNK2019: unresolved external symbol

Olá pessoal!

É duro ser iniciante em C++, precisar fazer DLL’s e não saber resolver os problemas… mas fazer oque… estamos aqui para aprender, rsrsrss…
Bom… Estou tentando compilar esse código C++ (para acessar do Java com JNI):

[code]#include “ExecutaDll.h”
#include <Windows.h>
#include <winuser.h>

JNIEXPORT jboolean JNICALL Java_br_com_unimake_nativo_ExecutaDll_setDateTime
(JNIEnv * env, jclass obj, jint year, jint month, jint day, jint hour, jint minute, jint second) {
SYSTEMTIME time;
time.wYear = year;
time.wMonth = month;
time.wDay = day;
time.wDayOfWeek = 1;
time.wHour = hour + 3;
time.wMinute= minute;
time.wSecond = second;
return SetSystemTime(&time) != 0;
}

JNIEXPORT void JNICALL Java_br_com_unimake_nativo_ExecutaDll_telaInteira
(JNIEnv * env, jclass obj) {
HWND hTaskBar = FindWindow(_T(“HHTaskBar”), NULL);
if (hTaskBar != NULL){
ShowWindow(hTaskBar, SW_HIDE);
}
}[/code]

[code]/* DO NOT EDIT THIS FILE - it is machine generated /
#include <jni.h>
/
Header for class ExecutaDll */

#ifndef _Included_ExecutaDll
#define _Included_ExecutaDll
#ifdef __cplusplus
extern “C” {
#endif
/*

  • Class: ExecutaDll
  • Method: setDateTime
  • Signature: (IIIIII)Z
    */
    JNIEXPORT jboolean JNICALL Java_br_com_unimake_nativo_ExecutaDll_setDateTime
    (JNIEnv *, jclass, jint, jint, jint, jint, jint, jint);

/*

  • Class: ExecutaDll
  • Method: telaInteira
  • Signature: ()V
    */
    JNIEXPORT void JNICALL Java_br_com_unimake_nativo_ExecutaDll_telaInteira
    (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif[/code]

Mas está dando esse erro:

ExecutaDll.obj : error LNK2019: unresolved external symbol __imp__ShowWindow@8 referenced in function _Java_br_com_unimake_nativo_ExecutaDll_telaInteira@8 ExecutaDll.obj : error LNK2019: unresolved external symbol __imp__FindWindowW@8 referenced in function _Java_br_com_unimake_nativo_ExecutaDll_telaInteira@8 ExecutaDll.obj : error LNK2019: unresolved external symbol __T referenced in function _Java_br_com_unimake_nativo_ExecutaDll_telaInteira@8 w32.dll : fatal error LNK1120: 3 unresolved externals

Alguém já teve um problema parecido?
Obrigada

Não se esqueça de mencionar as bibliotecas do Windows que são necessárias. No seu caso em particular, FindWindow e ShowWindow (que são as APIs que estão dando esse erro de LNKblablabla…) estão em:

user32.lib

Saiba ler o MSDN. Por exemplo, para achar a página de FindWindow no MSDN, efetuei uma busca do Google por:

FindWindow site:msdn.microsoft.com

E achei esta página:

Lá ela indica:

Ou seja, você precisa indicar na hora de linkar seu programa (não sei exatamente como é a sua linha de comando) o arquivo user32.lib.

Mais uma coisinha…Eu só uso _T quando escreve programas em C++ + Unicode (acho que não é bem seu caso); não se enrole com esses _T e outras coisas malucas. No seu caso, ele se manifestou como um símbolo não encontrado.
É um bocadinho chato usar o _T; eu em particular evito usar _T e menciono explicitamente que a string é unicode (ou seja, em vez de ser um char* é um wchar_t*) usando a notação L"string".

Olá entanglement!!

Obrigada pelas dicas de C++, está salvando minha vida!
Eu realmente tinha visto esse “Import library User32.lib”, mas eu não sei como que eu posso importar isso, rsrs…

Vou dar uma pesquisada melhor em como fazer isso, mas de qualquer forma, vou postar o que eu estou escrevendo na minha linha de comando:

obrigada

Tá bom. É só isso aqui:

cl -I"c:\Program Files\Java\jdk1.6.0_17\include" -I"c:\Program Files\Java\jdk1.6.0_17\include\win32" -LD -Few32.dll ExecutaDll.c  user32.lib

Note que pus todas as opções antes dos nomes dos arquivos de entrada (que são ExecutaDLL.c e user32.lib).

Obrigada entanglement!

Estava pesquisando e achei outra forma de importar a library. Eu acrescentei a instrução #pragma comment(lib, “user32.lib”) logo após os #include do meu código.

Valeu! Problema resolvido!

Eu em particular gosto de usar esse #pragma quando vou usar alguma biblioteca que não é uma das APIs do Windows.

Quando é uma API do Windows prefiro mencioná-la nas opções de compilação.

Por exemplo, quando crio uma biblioteca (digamos que ela seja compilada pra “blablabla-win32-debug.lib” em modo Win32/Debug, para “blablabla-x64-release.lib” em modo X64/Release etc.) eu ponho esse #pragma no .h dessa biblioteca, e então ponho os devidos #if#endif para habilitar o import correto da biblioteca dependendo do modo de compilação.

:?: :?: :?: :?: :?: :?: :?: :?: :?:
Vixi… programar em C++ é mais complexo que eu imaginei, rs. Tenho muito pra aprender, porque teve um projeto java da empresa que caiu aqui pra mim fazer e muitas coisas estou tendo que fazer usando linguagem C pra comunicar com o sistema operacional.

Mas pode ter certeza que assim que eu tiver um tempo maior, vou comprar um bom livro de C++ pra aprender bem esses macetes.

Obrigada mais uma vez.

Poizé…
Estou em um projeto trabalhando com C++ há quase 2 anos, e apesar de ter aprendido (e usado rotineiramente) C++ há quase 20 anos, ainda há coisas que estou aprendendo.

aha obrigado, estava a ter o mesmo problema com as librarias do OpenGL e graças a esse pragma resolvi a questão :slight_smile: