TBB Linker error Как узнать, что я пропустил включение или код устарел?

0

Я пытаюсь запустить код из этой статьи, однако, я сталкиваюсь с LNK2019 и LNK2001. Вот прямая ссылка для загрузки zip файла проекта. Прежде чем кто-нибудь спросит, я прочитал нерешенный вопрос о внешнем символе. Это помогло мне разобраться в нескольких вещах, но я до сих пор не могу понять эту проблему.

Проблема связана с привязкой к библиотеке TBB. Код проекта, похоже, был написан в 2009 году, когда TBB был в версии 2.X. Последний стабильный выпуск (тот, который я пытаюсь использовать) - 4.2. Я не могу найти версию, которая была использована для тестирования проекта, поэтому я не могу подтвердить это. Я также предпочел бы использовать самую последнюю версию библиотеки.

Может ли кто-нибудь помочь мне определить, вызваны ли эти ошибки компоновщиком из-за несоответствия api между кодом проекта и TBB, или я просто неправильно настраиваю свои переменные среды/страницы свойств? Я использую MSVS2010 Express.

Вот ошибки:

1>------ Build started: Project: VorteGrid, Configuration: Debug Win32 ------
1>inteSiVis.obj : error LNK2019: unresolved external symbol "public: void __thiscall tbb::task_scheduler_init::initialize(int,unsigned int)" (?initialize@task_scheduler_init@tbb@@QAEXHI@Z) referenced in function "public: __thiscall tbb::task_scheduler_init::task_scheduler_init(int,unsigned int)" (??0task_scheduler_init@tbb@@QAE@HI@Z)
1>inteSiVis.obj : error LNK2019: unresolved external symbol "void __cdecl tbb::assertion_failure(char const *,int,char const *,char const *)" (?assertion_failure@tbb@@YAXPBDH00@Z) referenced in function "public: __thiscall tbb::task_scheduler_init::task_scheduler_init(int,unsigned int)" (??0task_scheduler_init@tbb@@QAE@HI@Z)
1>vortonSim.obj : error LNK2001: unresolved external symbol "void __cdecl tbb::assertion_failure(char const *,int,char const *,char const *)" (?assertion_failure@tbb@@YAXPBDH00@Z)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "void __cdecl tbb::assertion_failure(char const *,int,char const *,char const *)" (?assertion_failure@tbb@@YAXPBDH00@Z)
1>inteSiVis.obj : error LNK2019: unresolved external symbol "public: void __thiscall tbb::task_scheduler_init::terminate(void)" (?terminate@task_scheduler_init@tbb@@QAEXXZ) referenced in function "public: __thiscall tbb::task_scheduler_init::~task_scheduler_init(void)" (??1task_scheduler_init@tbb@@QAE@XZ)
1>vortonSim.obj : error LNK2019: unresolved external symbol "public: __thiscall tbb::task_group_context::~task_group_context(void)" (??1task_group_context@tbb@@QAE@XZ) referenced in function "public: static void __cdecl tbb::interface6::internal::start_for<class tbb::blocked_range<unsigned int>,class VortonSim_ComputeVelocityGrid_TBB,class tbb::auto_partitioner const >::run(class tbb::blocked_range<unsigned int> const &,class VortonSim_ComputeVelocityGrid_TBB const &,class tbb::auto_partitioner const &)" (?run@?$start_for@V?$blocked_range@I@tbb@@VVortonSim_ComputeVelocityGrid_TBB@@$$CBVauto_partitioner@2@@internal@interface6@tbb@@SAXABV?$blocked_range@I@4@ABVVortonSim_ComputeVelocityGrid_TBB@@ABVauto_partitioner@4@@Z)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "public: __thiscall tbb::task_group_context::~task_group_context(void)" (??1task_group_context@tbb@@QAE@XZ)
1>vortonSim.obj : error LNK2019: unresolved external symbol "protected: void __thiscall tbb::task_group_context::init(void)" (?init@task_group_context@tbb@@IAEXXZ) referenced in function "public: __thiscall tbb::task_group_context::task_group_context(enum tbb::task_group_context::kind_type,unsigned int)" (??0task_group_context@tbb@@QAE@W4kind_type@01@I@Z)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "protected: void __thiscall tbb::task_group_context::init(void)" (?init@task_group_context@tbb@@IAEXXZ)
1>vortonSim.obj : error LNK2019: unresolved external symbol "public: class tbb::task & __thiscall tbb::internal::allocate_root_with_context_proxy::allocate(unsigned int)const " (?allocate@allocate_root_with_context_proxy@internal@tbb@@QBEAAVtask@3@I@Z) referenced in function "void * __cdecl operator new(unsigned int,class tbb::internal::allocate_root_with_context_proxy const &)" (??2@YAPAXIABVallocate_root_with_context_proxy@internal@tbb@@@Z)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "public: class tbb::task & __thiscall tbb::internal::allocate_root_with_context_proxy::allocate(unsigned int)const " (?allocate@allocate_root_with_context_proxy@internal@tbb@@QBEAAVtask@3@I@Z)
1>vortonSim.obj : error LNK2019: unresolved external symbol "public: void __thiscall tbb::internal::allocate_root_with_context_proxy::free(class tbb::task &)const " (?free@allocate_root_with_context_proxy@internal@tbb@@QBEXAAVtask@3@@Z) referenced in function "void __cdecl operator delete(void *,class tbb::internal::allocate_root_with_context_proxy const &)" (??3@YAXPAXABVallocate_root_with_context_proxy@internal@tbb@@@Z)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "public: void __thiscall tbb::internal::allocate_root_with_context_proxy::free(class tbb::task &)const " (?free@allocate_root_with_context_proxy@internal@tbb@@QBEXAAVtask@3@@Z)
1>vortonSim.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall tbb::task::note_affinity(unsigned short)" (?note_affinity@task@tbb@@UAEXG@Z)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall tbb::task::note_affinity(unsigned short)" (?note_affinity@task@tbb@@UAEXG@Z)
1>vortonSim.obj : error LNK2019: unresolved external symbol "unsigned int __cdecl tbb::internal::get_initial_auto_partitioner_divisor(void)" (?get_initial_auto_partitioner_divisor@internal@tbb@@YAIXZ) referenced in function "public: __thiscall tbb::interface6::internal::auto_partition_type_base<class tbb::interface6::internal::auto_partition_type>::auto_partition_type_base<class tbb::interface6::internal::auto_partition_type>(void)" (??0?$auto_partition_type_base@Vauto_partition_type@internal@interface6@tbb@@@internal@interface6@tbb@@QAE@XZ)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "unsigned int __cdecl tbb::internal::get_initial_auto_partitioner_divisor(void)" (?get_initial_auto_partitioner_divisor@internal@tbb@@YAIXZ)
1>vortonSim.obj : error LNK2019: unresolved external symbol "private: void __thiscall tbb::task::internal_set_ref_count(int)" (?internal_set_ref_count@task@tbb@@AAEXH@Z) referenced in function "public: void __thiscall tbb::task::set_ref_count(int)" (?set_ref_count@task@tbb@@QAEXH@Z)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "private: void __thiscall tbb::task::internal_set_ref_count(int)" (?internal_set_ref_count@task@tbb@@AAEXH@Z)
1>vortonSim.obj : error LNK2019: unresolved external symbol "public: bool __thiscall tbb::task_group_context::is_group_execution_cancelled(void)const " (?is_group_execution_cancelled@task_group_context@tbb@@QBE_NXZ) referenced in function "public: bool __thiscall tbb::task::is_cancelled(void)const " (?is_cancelled@task@tbb@@QBE_NXZ)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "public: bool __thiscall tbb::task_group_context::is_group_execution_cancelled(void)const " (?is_group_execution_cancelled@task_group_context@tbb@@QBE_NXZ)
1>vortonSim.obj : error LNK2019: unresolved external symbol "public: class tbb::task & __thiscall tbb::internal::allocate_child_proxy::allocate(unsigned int)const " (?allocate@allocate_child_proxy@internal@tbb@@QBEAAVtask@3@I@Z) referenced in function "void * __cdecl operator new(unsigned int,class tbb::internal::allocate_child_proxy const &)" (??2@YAPAXIABVallocate_child_proxy@internal@tbb@@@Z)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "public: class tbb::task & __thiscall tbb::internal::allocate_child_proxy::allocate(unsigned int)const " (?allocate@allocate_child_proxy@internal@tbb@@QBEAAVtask@3@I@Z)
1>vortonSim.obj : error LNK2019: unresolved external symbol "public: void __thiscall tbb::internal::allocate_child_proxy::free(class tbb::task &)const " (?free@allocate_child_proxy@internal@tbb@@QBEXAAVtask@3@@Z) referenced in function "void __cdecl operator delete(void *,class tbb::internal::allocate_child_proxy const &)" (??3@YAXPAXABVallocate_child_proxy@internal@tbb@@@Z)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "public: void __thiscall tbb::internal::allocate_child_proxy::free(class tbb::task &)const " (?free@allocate_child_proxy@internal@tbb@@QBEXAAVtask@3@@Z)
1>vortonSim.obj : error LNK2019: unresolved external symbol "public: class tbb::task & __thiscall tbb::internal::allocate_continuation_proxy::allocate(unsigned int)const " (?allocate@allocate_continuation_proxy@internal@tbb@@QBEAAVtask@3@I@Z) referenced in function "void * __cdecl operator new(unsigned int,class tbb::internal::allocate_continuation_proxy const &)" (??2@YAPAXIABVallocate_continuation_proxy@internal@tbb@@@Z)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "public: class tbb::task & __thiscall tbb::internal::allocate_continuation_proxy::allocate(unsigned int)const " (?allocate@allocate_continuation_proxy@internal@tbb@@QBEAAVtask@3@I@Z)
1>vortonSim.obj : error LNK2019: unresolved external symbol "public: void __thiscall tbb::internal::allocate_continuation_proxy::free(class tbb::task &)const " (?free@allocate_continuation_proxy@internal@tbb@@QBEXAAVtask@3@@Z) referenced in function "void __cdecl operator delete(void *,class tbb::internal::allocate_continuation_proxy const &)" (??3@YAXPAXABVallocate_continuation_proxy@internal@tbb@@@Z)
1>particleRenderer.obj : error LNK2001: unresolved external symbol "public: void __thiscall tbb::internal::allocate_continuation_proxy::free(class tbb::task &)const " (?free@allocate_continuation_proxy@internal@tbb@@QBEXAAVtask@3@@Z)
1>VorteGrid\Debug\VorteGrid.exe : fatal error LNK1120: 15 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

ОБНОВИТЬ

Мне удалось запустить код CFD! Yay :) Проблема в том, что я на 64-битной машине, но я использовал 32-разрядную версию MSVS2010 express. Я этого не осознавал, и я пытался использовать библиотеки intel64 (т.е....\tbb\lib\intel64\vc10). Как-то этот вопрос проявился в ошибках компоновщика, что на самом деле не имеет смысла. Во всяком случае, переход на ia32 прояснил эту проблему, и проект будет построен.

Следующим препятствием было приложение, жалующееся на некоторые не описательные ошибки, такие как "Произошла ошибка с программой ([код реестра])". Поэтому я в конечном итоге пытался запустить примеры TBB. В примерах приведены более четкие ошибки при запуске, говоря: "На вашем компьютере отсутствует файл tbb.dll. Попробуйте переустановить программу". После еще нескольких поисковых запросов я нашел простое решение: переместите файлы DLL, на которые он жаловался, в каталог приложения.

Затем, наконец, приложение работало. Визуальный эффект так стоит. Я не могу дождаться, когда начну играть с этим.

Теги:
linker
error-handling
tbb

1 ответ

1
Лучший ответ

Эти ошибки вызваны некоторыми проблемами среды/конфигурации.

Как правило, новые версии TBB совместимы (как на исходном, так и на двоичном уровне) со старыми. Конкретные символы, указанные в приведенных ошибках, относятся к функциональности основного TBB; они не изменились какое-то время и, безусловно, существуют в бинарных версиях версии 4.2.

  • 0
    Не тот ответ, который я хотел услышать, но это то, что мне нужно было услышать. Я снова проведу настройку с помощью расчески с мелкими зубьями. Когда я найду проблему, я добавлю ответ, чтобы обрисовать, как я решил проблемы (ваш ответ по-прежнему будет принятым).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню