![]() |
Let's try a more complex example involving an HPX component. An HPX component is a class which exposes HPX actions. HPX components are compiled into dynamically loaded modules called component libraries. Here's the source code:
hello_world_component.cpp
#include "hello_world_component.hpp" #include <hpx/include/iostreams.hpp> namespace examples { namespace server { void hello_world::invoke() { hpx::cout << "Hello HPX World!\n" << hpx::flush; } }} HPX_REGISTER_COMPONENT_MODULE(); typedef hpx::components::managed_component< examples::server::hello_world > hello_world_type; HPX_REGISTER_MINIMAL_COMPONENT_FACTORY(hello_world_type, hello_world); HPX_DEFINE_GET_COMPONENT_TYPE(hello_world_type::wrapped_type); HPX_REGISTER_ACTION_EX( examples::server::hello_world::invoke_action, hello_world_invoke_action);
hello_world_component.hpp
#if !defined(HELLO_WORLD_COMPONENT_HPP) #define HELLO_WORLD_COMPONENT_HPP #include <hpx/hpx_fwd.hpp> #include <hpx/include/actions.hpp> #include <hpx/include/lcos.hpp> #include <hpx/include/components.hpp> #include <hpx/include/serialization.hpp> namespace examples { namespace server { struct HPX_COMPONENT_EXPORT hello_world : hpx::components::managed_component_base<hello_world> { void invoke(); typedef hpx::actions::action0< hello_world, 0, &hello_world::invoke > invoke_action; }; } namespace stubs { struct hello_world : hpx::components::stub_base<server::hello_world> { static void invoke(hpx::naming::id_type const& gid) { hpx::lcos::async<server::hello_world::invoke_action>(gid).get(); } }; } struct hello_world : hpx::components::client_base<hello_world, stubs::hello_world> { typedef hpx::components::client_base<hello_world, stubs::hello_world> base_type; void invoke() { this->base_type::invoke(this->gid_); } }; } HPX_REGISTER_ACTION_DECLARATION_EX( examples::server::hello_world::invoke_action, hello_world_invoke_action); #endif // HELLO_WORLD_COMPONENT_HPP
hello_world_client.cpp
#include "hello_world_component.hpp" #include <hpx/hpx_init.hpp> int hpx_main(boost::program_options::variables_map&) { { examples::hello_world client; // Create a single instance of the component on this locality. client.create(hpx::find_here()); // Invoke the components action, which will print "Hello World!". client.invoke(); } return hpx::finalize(); // Initiate shutdown of the runtime system. } int main(int argc, char* argv[]) { // Configure application-specific options. boost::program_options::options_description desc_commandline( "usage: " HPX_APPLICATION_STRING " [options]"); return hpx::init(desc_commandline, argc, argv); // Initialize and run HPX. }
Copy the three source files above into three files (called hello_world_component.cpp, hello_world_component.hpp and hello_world_client.cpp respectively).
Now, in the directory where you put the files, run the following command
to build the component library. (where $HPX_LOCATION
is the CMAKE_INSTALL_PREFIX you used while building
HPX):
$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HPX_LOCATION/lib/pkgconfig $ c++ -o libhpx_component_hello_world.so hello_world_component.cpp `pkg-config --cflags --libs hpx_component` -DHPX_COMPONENT_NAME=hello_world $ mv libhpx_component_hello_world.so $HPX_LOCATION/lib/hpx/libhpx_component_hello_world.so
Now, to build the application that uses this component (hello_world_client.cpp), we do:
$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HPX_LOCATION/lib/pkgconfig $ c++ -o hello_world_client hello_world_client.cpp `pkg-config --cflags --libs hpx_application` -lhpx_component_iostreams -lhpx_component_hello_world
![]() |
Important |
|---|---|
When using pkg-config with HPX, the pkg-config flags must go after the
|
To test the program, type:
$ ./hello_world_client
which should print Hello HPX World! and exit.