// Copyright 2014 Renato Tegon Forti, Antony Polukhin. // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) //[callplugcpp_tutorial3 #include // for import_function_alias #include #include #include "../tutorial_common/plugin_api.hpp" namespace dll = boost::dll; std::size_t search_for_symbols(const std::vector& plugins) { std::size_t plugins_found = 0; boost::shared_ptr lib = boost::make_shared(); for (std::size_t i = 0; i < plugins.size(); ++i) { std::cout << "Loading plugin: " << plugins[i] << '\n'; lib->load(plugins[i], dll::load_mode::append_decorations); if (!lib->search_symbol("create_plugin")) { // no such symbol continue; } // library has symbol, importing... typedef boost::shared_ptr (pluginapi_create_t)(); boost::function creator = dll::import_function_alias(lib, "create_plugin"); std::cout << "Matching plugin name: " << creator()->name() << std::endl; ++ plugins_found; } return plugins_found; } //] int main(int argc, char* argv[]) { /*<-*/ BOOST_ASSERT(argc >= 2); /*->*/ // argv[1] contains path to our plugin library std::vector plugins; boost::filesystem::path base_dir = argv[1]; plugins.push_back(base_dir / "my_plugin_aggregator"); plugins.push_back(base_dir / "my_plugin_sum"); const std::size_t res = search_for_symbols(plugins); BOOST_ASSERT(res == 1); }