Pergunta

Eu estou tentando usar uma dll, ou seja, libcurl, com o meu programa, mas, não está ligando. Libcurl vem com arquivos .h que pode incluir (cuida de dllimport), mas então eu acho que deve especificar qual DLL para realmente usar quando ligar de alguma forma ... Como posso fazer isso? Estou compilando com o construtor Borland C ++, mas eu realmente quero saber como essas coisas funcionam, em geral ...

EDIT: Este é o código (em linha reta c / p do homepage curl)

bool FTPGetFile::ConnectToFTP(string ftpServer){
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
    res = curl_easy_perform(curl);
    return true;
}else{
    return false;
}
} 

E aqui estão os erros:

[Linker Error] Error: Unresolved external '_curl_easy_init' referenced from C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ
[Linker Error] Error: Unresolved external '_curl_easy_setopt' referenced from C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ
[Linker Error] Error: Unresolved external '_curl_easy_perform' referenced from C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ

EDIT 2: Como por sugestão de joe_muc Fiz os arquivos lib com a ferramenta implib e incluiu-os no caminho vinculador. Eu ainda obter os mesmos erros.

Foi útil?

Solução

Como mencionado, você precisará do arquivo lib estática que se passa com o arquivo .dll que você executa através implib e adicionar o arquivo lib resultado ao seu projeto.

Se você tiver feito isso, então:

  • Você pode precisar usar a convenção stdcall chamada. Você não mencionou qual versão do construtor que você está usando, mas é geralmente sob Opções do projecto - Advanced compilador -. Chamando convenção
  • Você pode precisar de opção de compatibilidade MFC para permitir.
  • Poderia ser um nome desconfiguração questão (Opções do projecto - C ++ opções de compatibilidade).
  • Ou geração sublinhados
  • Ou opções vinculador avançadas "Case_insensitive-link" on ou off

libcurl parece ser código C; mas se for C ++, nota que a Microsoft e Borland aulas geralmente não são compatíveis. Não é suposto ser truques para levá-los para o trabalho, mas é uma verdadeira bagunça para lidar com e eu nunca tive sucesso. C DLLs codificados deve funcionar.

Outras dicas

Deve haver um programa chamado IMPLIB.EXE no diretório bin ou aplicativo para o construtor. Execute que contra a dll para criar um arquivo .lib.

edit: online Docs

Use "Depends.exe" para procurar a DLL, e encontrar os nomes exatos das funções que você deseja usar, em seguida, adicione o arquivo .lib para a dll (ou criá-lo usando implib da Borland), e incluem a .lib no seu arquivo de projeto BPR, clicando com o botão direito e adicioná-lo ao projeto. em seguida, na parte superior do seu código, use __declspec (dllimport) para agradar os deuses vinculador.

Normalmente, se você está ligando contra uma DLL do Windows, você vai precisar para passar o nome de qualquer um a DLL ou a biblioteca de importação para o vinculador caso contrário não será capaz de ligar o executável.

A mensagem de erro que você cita sugere que você de fato terá de especificar o DLL ou biblioteca de importação. Quando você construiu onda como uma DLL, ele provavelmente criou tanto uma lib e um arquivo .dll. Aponte seu vinculador na .lib e quando você iniciar o aplicativo, certifique-se de que o arquivo .dll está em um diretório que está no caminho para o carregador pode encontrá-lo.

De longe, a solução mais comum é usar a biblioteca de importação (.lib) que você deve ter como parte da construção de libcurl. Este informa o vinculador (estático) como preparar o EXE para o carregamento dinâmico.

Você já tentou adicionar o arquivo .h para seu projeto?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top