Pergunta

Eu tenho uma solução com vários projetos. Eu tenho um projeto "main", que age como um menu ea partir daí, o usuário pode acessar qualquer um dos outros projetos. Nesta projeto principal, recebo erros de vinculador para cada função chamada. Como faço para evitar esses erros vinculador? I definir as dependências do projeto já no "Projeto Dependências ..." diálogo.

Graças

Editar - eu fiz como sugerido e acrescentou a pasta de saída para diretórios adicionais do vinculador. Agora, porém, eu recebo um milhão de erros da seguinte forma:

3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputn(char const *,int)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_streambuf > * __thiscall std::basic_ios >::rdbuf(void)const " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " (?flags@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " (?width@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits::length(char const *)" (?length@?$char_traits@D@std@@SAIPBD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > & __thiscall std::basic_ostream >::flush(void)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > * __thiscall std::basic_ios >::tie(void)const " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@QBE_NXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) already defined in panels.lib(panel_main.obj)
3>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" (?facet_Register@facet@locale@std@@CAXPAV123@@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (?_Init@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string,class std::allocator > const &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
Foi útil?

Solução

Sem saber qualquer outro detalhe sobre a sua solução é difícil dizer, no entanto Reconstruir tudo, pode ser útil. Esta situação pode, por vezes, ocorrem quando há arquivos de objetos mistos para arquiteturas diferentes.

Você também pode querer considerar o uso de "Referências" em vez de "dependências"

EDIT:

Depois que você postou parece que sua ligação com bibliotecas padrão é inconsistente. Poderia ser que um dos projetos liga bibliotecas padrão estaticamente, enquanto outros dinamicamente? (Veja projeto Propriedades-> vinculador) Ou um para o tempo de execução de lançamento, enquanto outros para depurar? (Embora o último deve ser possível, com ressalvas)

Outras dicas

É difícil responder sem saber todos os detalhes sobre sua solução, mas vou assumir o seu projeto "outros" são configurados para produzir um arquivo lib, e o projeto principal, em seguida, liga todos esses arquivos lib. Se for esse o caso, então uma possível causa para os erros que você está recebendo é que seus projetos conectar-se a diferentes versões da biblioteca de tempo de execução.

De documentação da Microsoft, "Todos os módulos passados ??para uma determinada invocação do vinculador deve ter sido compilado com o mesmo tempo de execução opção do compilador biblioteca (/ MD, / MT, / LD)."

Tente mudar todos os projetos para usar a mesma versão da biblioteca de tempo de execução. Em Visual Studio 2010, isto é, em propriedades do projeto | Propriedades de configuração | C / C ++ | Geração de Código | Biblioteca de tempo de execução. Escolha qualquer Multi-threaded Debug DLL ou Multi-threaded Debug (para a sua configuração de depuração).

Os erros que você está recebendo são 'erro LNK2005', onde um símbolo na biblioteca que você está ligando (MSVCPRTD.lib) já foi definido em outra biblioteca (por exemplo panels.lib). Se você adicionar panels.lib para o campo 'ignorar biblioteca específica' (em VS2008 Propriedades de Configuração -> Linker -> Input -> Ignorar bibliotecas específicas), os erros vão parar.

Eu presumo que os erros vinculador que você está recebendo são de "símbolos não resolvidos"?

Se estiver usando bibliotecas estáticas (arquivo ou seja lib), você vai precisar adicionar a biblioteca à entrada de vinculador, para que em tempo de ligação dos símbolos pode ser ligado contra. Se você não fizer isso, você receberá um símbolo não resolvido:

  1. Clique com o botão direito do mouse no projeto e selecione Propriedades.
  2. Selecionar configuração Propriedades-> Linker-> Entrada
  3. Digite o nome da biblioteca (por exemplo filename.lib) sob Dependências adicionais.

Eu tive um problema muito semelhante a esta que acabou por ser porque uma das minhas bibliotecas teve 'wchar_t Tratar como built-in type' a opção definida para um valor diferente para os outros. Esta configuração é falsa por padrão em novos projetos. Mudando-los todos para a verdadeira corrigiu o problema.

Exatamente, pelo menos um de seus projetos é compilado com um diferente "Runtime Library", então os outros. Talvez você adicionou um novo usando o padrão que é diferente. Verifique as propriedades do seu projeto (s) de igual valor de "Propriedades de Configuração" -> "C / C ++" -> "Geração de código." -> "Runtime Library"

No meu caso, o problema foi porque eu tinha mantido os protótipos de função, as definições de classe e a implementação da função e a implementação da classe em um único arquivo cpp. Só quando eu troquei as declarações e protótipos para um arquivo de cabeçalho separado fez esses erros desaparecer. Realmente estranho!

No meu caso, tenho dois métodos:

  1. Project Properties -> C / C ++ -> Geração de código -..> Runtime Library alterá-lo para MT

  2. Adicione sua biblioteca falta de:.. Linker-> Input -> Dependências adicionais Se ele não funciona, tente adicionar um caminho completo em vez de um nome de biblioteca

Por exemplo: C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ lib \ amd64 \ libvcruntime.lib;

que funciona para me.Answer esta pergunta para qualquer um precisa de ajuda.

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