fix load path so

This commit is contained in:
2026-03-22 04:42:26 +00:00
parent 7baa7000b8
commit 5583b3e0f2
4 changed files with 20 additions and 14 deletions

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>

View File

@@ -83,6 +83,7 @@ extern "C" NavigationHandle navigation_create(void)
// Using default constructor - initialization will be done via navigation_initialize()
robot::PluginLoaderHelper loader;
std::string path_file_so = loader.findLibraryPath("MoveBase");
robot::log_warning("%s", path_file_so.c_str());
auto move_base_loader = boost::dll::import_alias<robot::move_base_core::BaseNavigation::Ptr()>(
path_file_so, "MoveBase", boost::dll::load_mode::append_decorations);
auto move_base_ptr = move_base_loader();

View File

@@ -89,7 +89,7 @@ public:
private:
/**
* @brief Resolve library path (handle relative paths, search in search_paths)
* @brief Resolve library path (absolute, then PNKX_NAV_CORE_LIBRARY_PATH, search_paths_, cwd)
* @param library_path Path from config (may be relative or absolute)
* @return Resolved absolute path, or empty if not found
*/

View File

@@ -98,7 +98,6 @@ std::string PluginLoaderHelper::findLibraryPath(const std::string& symbol_name)
}
}
}
// Try LD_LIBRARY_PATH as fallback
const char* ld_path = std::getenv("LD_LIBRARY_PATH");
if (ld_path) {
@@ -199,21 +198,27 @@ std::string PluginLoaderHelper::resolveLibraryPath(const std::string& library_pa
return "";
}
// If relative path, search in search_paths (build directory is already added)
std::string build_dir = getBuildDirectory();
if (!build_dir.empty()) {
// First try in build directory
// Add .so extension if not present
// If relative path, search under PNKX_NAV_CORE_LIBRARY_PATH (':'-separated, like LD_LIBRARY_PATH)
const char* nav_lib_path_env = std::getenv("PNKX_NAV_CORE_LIBRARY_PATH");
if (nav_lib_path_env) {
std::string lib_path_with_ext = library_path;
if (lib_path_with_ext.find(".so") == std::string::npos) {
lib_path_with_ext += ".so";
}
std::filesystem::path full_path = std::filesystem::path(build_dir) / lib_path_with_ext;
if (std::filesystem::exists(full_path)) {
try {
return std::filesystem::canonical(full_path).string();
} catch (...) {
return full_path.string();
std::string nav_lib_paths(nav_lib_path_env);
std::stringstream ss(nav_lib_paths);
std::string base_dir;
while (std::getline(ss, base_dir, ':')) {
if (base_dir.empty()) {
continue;
}
std::filesystem::path full_path = std::filesystem::path(base_dir) / lib_path_with_ext;
if (std::filesystem::exists(full_path)) {
try {
return std::filesystem::canonical(full_path).string();
} catch (...) {
return full_path.string();
}
}
}
}