Another option to avoid the cyclic linker dependency would be to have all components in the same shared library.
Regards Hartmut --------------- <http://boost-spirit.com> http://boost-spirit.com <http://stellar.cct.lsu.edu> http://stellar.cct.lsu.edu From: [email protected] [mailto:[email protected]] On Behalf Of Tim Biedert Sent: Wednesday, November 16, 2016 9:08 AM To: [email protected] Subject: Re: [hpx-users] Undefined symbols: transfer_action(), transfer_continuation_action(), get_action_name<>() Update: I solved it. Instead of a HPX issue, it was rather a Clang characteristic: Had to pass -undefined dynamic_lookup to Clang to ignore the missing symbols when building the shared component library. I guess this is the default behavior of GCC. Also, I guess the project used to compile on OS X earlier because we have only introduced these cyclic dependencies between components more recently. Some more information: http://stackoverflow.com/questions/25421479/clang-and-undefined-symbols-when-building-a-library Maybe this monologue helps someone :-) Best, Tim On 16 Nov 2016, at 15:53, Tim Biedert <[email protected] <mailto:[email protected]> > wrote: A follow-up to the issue: My CMakeLists.txt looks basically like this: add_hpx_component(Block ESSENTIAL SOURCES Block.cpp Block.h # ... ) add_hpx_component(Container ESSENTIAL SOURCES Container.cpp Container.h # ... COMPONENT_DEPENDENCIES Block ) The undefined symbols error comes at the first stage "Linking CXX shared library libhpx_Block.dylib”. When I add Container.cpp and Container.h to the SOURCES of the *Block* component the undefined symbols disappear (and the linker complains about other now duplicate symbols, but that’s a different issue). I’m just wondering: Why is it working on Arch (HPX couple of weeks old) and Ubuntu (HPX some months old), but not on macOS with the latest master of HPX? Also, I haven’t tested the project for some months on OS X, but I believe it used to work this way, too. Thanks! Best, Tim On 16 Nov 2016, at 15:32, Tim Biedert <[email protected] <mailto:[email protected]> > wrote: On macOS with current HPX master I get the following linker errors when compiling my project, which works fine on my Arch Linux machine with a couple of weeks old HPX. Undefined symbols for architecture x86_64: "hpx::actions::transfer_action<server::Container::render_action>::transfer_action()", referenced from: hpx::actions::detail::register_action<server::Container::render_action>::create(bool) in Block.cpp.o hpx::actions::detail::register_action<server::Container::render_action>::create(bool) in CommunicationHandler.cpp.o "hpx::actions::transfer_action<server::Container::loadData_action>::transfer_action()", referenced from: hpx::actions::detail::register_action<server::Container::loadData_action>::create(bool) in Block.cpp.o hpx::actions::detail::register_action<server::Container::loadData_action>::create(bool) in CommunicationHandler.cpp.o "hpx::actions::transfer_action<server::Container::initBlocks_action>::transfer_action()", referenced from: hpx::actions::detail::register_action<server::Container::initBlocks_action>::create(bool) in Block.cpp.o hpx::actions::detail::register_action<server::Container::initBlocks_action>::create(bool) in CommunicationHandler.cpp.o "hpx::actions::transfer_action<server::Container::updateConfig_action>::transfer_action()", referenced from: hpx::actions::detail::register_action<server::Container::updateConfig_action>::create(bool) in Block.cpp.o hpx::actions::detail::register_action<server::Container::updateConfig_action>::create(bool) in CommunicationHandler.cpp.o "hpx::actions::transfer_continuation_action<server::Container::render_action>::transfer_continuation_action()", referenced from: hpx::actions::detail::register_action<server::Container::render_action>::create(bool) in Block.cpp.o hpx::actions::detail::register_action<server::Container::render_action>::create(bool) in CommunicationHandler.cpp.o "hpx::actions::transfer_continuation_action<server::Container::loadData_action>::transfer_continuation_action()", referenced from: hpx::actions::detail::register_action<server::Container::loadData_action>::create(bool) in Block.cpp.o hpx::actions::detail::register_action<server::Container::loadData_action>::create(bool) in CommunicationHandler.cpp.o "hpx::actions::transfer_continuation_action<server::Container::initBlocks_action>::transfer_continuation_action()", referenced from: hpx::actions::detail::register_action<server::Container::initBlocks_action>::create(bool) in Block.cpp.o hpx::actions::detail::register_action<server::Container::initBlocks_action>::create(bool) in CommunicationHandler.cpp.o "hpx::actions::transfer_continuation_action<server::Container::updateConfig_action>::transfer_continuation_action()", referenced from: hpx::actions::detail::register_action<server::Container::updateConfig_action>::create(bool) in Block.cpp.o hpx::actions::detail::register_action<server::Container::updateConfig_action>::create(bool) in CommunicationHandler.cpp.o "char const* hpx::actions::detail::get_action_name<server::Container::render_action>()", referenced from: hpx::actions::detail::register_action<server::Container::render_action>::register_action() in Block.cpp.o hpx::actions::detail::register_action<server::Container::render_action>::register_action() in CommunicationHandler.cpp.o "char const* hpx::actions::detail::get_action_name<server::Container::loadData_action>()", referenced from: hpx::actions::detail::register_action<server::Container::loadData_action>::register_action() in Block.cpp.o hpx::actions::detail::register_action<server::Container::loadData_action>::register_action() in CommunicationHandler.cpp.o "char const* hpx::actions::detail::get_action_name<server::Container::initBlocks_action>()", referenced from: hpx::actions::detail::register_action<server::Container::initBlocks_action>::register_action() in Block.cpp.o hpx::actions::detail::register_action<server::Container::initBlocks_action>::register_action() in CommunicationHandler.cpp.o "char const* hpx::actions::detail::get_action_name<server::Container::updateConfig_action>()", referenced from: hpx::actions::detail::register_action<server::Container::updateConfig_action>::register_action() in Block.cpp.o hpx::actions::detail::register_action<server::Container::updateConfig_action>::register_action() in CommunicationHandler.cpp.o ld: symbol(s) not found for architecture x86_64 Any ideas where this comes from? Some (simplified) code to show how actions are declared/registered: —— Container.h: —— namespace server { class Container : public hpx::components::simple_component_base<Container> { public: glm::ivec3 loadData(const Config& config); HPX_DEFINE_COMPONENT_ACTION(Container, loadData); // ... }; } HPX_REGISTER_ACTION_DECLARATION(server::Container::loadData_action, container_loadData_action); // similar for other actions —— Container.cpp: —— #include "Container.h" HPX_REGISTER_COMPONENT_MODULE(); typedef hpx::components::simple_component<server::Container> Container_type; HPX_REGISTER_COMPONENT(Container_type, Container); HPX_REGISTER_ACTION(Container_type::wrapped_type::loadData_action, container_loadData_action); // similar for other actions namespace server { glm::ivec3 Container::loadData(const Config& config) { // ... } } Thanks! Tim _______________________________________________ hpx-users mailing list [email protected] <mailto:[email protected]> https://mail.cct.lsu.edu/mailman/listinfo/hpx-users _______________________________________________ hpx-users mailing list [email protected] <mailto:[email protected]> https://mail.cct.lsu.edu/mailman/listinfo/hpx-users
_______________________________________________ hpx-users mailing list [email protected] https://mail.cct.lsu.edu/mailman/listinfo/hpx-users
