Pergunta

Eu tenho esta aplicação MFC Eu estou trabalhando em que as necessidades de ter um banco de dados integrado. Então eu fui caça para um liso, rápido banco de dados "embutido" para ele e tropeçavam em SQLite.

Eu criei um DB com ele, e eu criei um projeto de biblioteca estática com o Visual Studio 2008. o projeto de biblioteca será usado em outro projeto principal.

No projeto de biblioteca, eu criei um DBClass classe com um AddFeedToDB(CFeed f) método. O projeto de biblioteca usa o arquivo .lib de codeproject (cppsqlite3.lib).

Ao compilar a biblioteca estática, nenhum erro for detectado, mas quando tento usar o arquivo de projeto de biblioteca no projeto principal, eu recebo este tipo de erros:

error LNK2019: unresolved external symbol "public:void __thiscall
   CppSQLite3DB::close(void)" (?close@CppSQLite3DB@@QAEXXZ 
   referenced in function "public: int __thiscall
   CTalkingFeedsDB::AddFeedToDB(class CFeed,char const*)" (?
   AddFeedToDB@CTalkingFeedsDB@@QAEHVCFeed@@PDB@Z

O que eu estou ausente?

Foi útil?

Solução

Isso aconteceu comigo mais de uma vez que eu pensei símbolo XXX (ou seja ?close@CppSQLite3DB@@QAEXXZ) foi na lib importação, enquanto o símbolo real foi __impXXX (ou seja __imp?close@CppSQLite3DB@@QAEXXZ).

A razão para o erro vinculador é, então, a ser encontrada na etapa de compilação: o compilador irá gerar o símbolo ?close@CppSQLite3DB@@QAEXXZ a ser importado, onde deve gerar __imp?close@CppSQLite3DB@@QAEXXZ. Isto significa muitas vezes que a própria declaração da função não tem __declspec( dllimport ). Que pode ser causada por algum símbolo pré-processador não está sendo definida. Ou o __declspec não estar ali ...

Outras dicas

Eu sei que já é de 2 anos desde que esta pergunta ... mas eu correr na mesma situação aqui. Adicionado todos os arquivos de cabeçalho ... aditados os lib .. e continuar a ter este erro. Então eu adicionei manualmente o lib para as propriedades de configuração -> Linker -> Input -> Adicional Dependências e todos os trabalhos para mim.

Não sei se é o seu caso, mas o prefixo imp pode significar que você está compilando uma biblioteca x64 em um projeto Win32.

Você quer necessidade de ligar o codeproject SQLite lib para o seu executável, ou para incluir os arquivos de fontes em seu projeto diretamente. (Qual deles você fez?)

Eu siga estes passos:

  1. pensar sobre o que biblioteca ou .obj arquivo você espera que o símbolo a ser exportado pelo.

  2. Verifique se ele realmente faz de exportação que muito símbolo (cheque personagem-wise). Às vezes, é as difere convenção de chamada.

  3. Verifique se a biblioteca que você espera para conter o símbolo é conhecido para o vinculador - primeiro cheque para os 'bibliotecas adicionais', em seguida, verificar se a biblioteca é realmente encontrado (eu principalmente fazer isso usando FileMon.exe de sysinternals, e olhar para link.exe para abrir o arquivo lib.)

Depois de pensar um tempo, você pode achar que seu projeto de biblioteca irá não exportar o procurou para a função. Essa função está no lib banco de dados. Você deve acrescentar que lib ao seu projeto principal. Não adianta adicioná-lo ao seu projeto lib estático.

O compilador e vinculador não irá ligar uma biblioteca em outro (a menos que um é um DLL). Você precisa especificar as duas bibliotecas (cppsqlite3.lib e sua própria biblioteca estática) em seu projeto principal.

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