【问题标题】:How to properly load a configuration file from a C++ library如何从 C++ 库中正确加载配置文件
【发布时间】:2012-10-16 10:12:23
【问题描述】:

我正在为图像分析任务编写一个小型库,我需要根据文件中存储的信息初始化一些对象。这些文件随库一起提供。但是,在我的代码中,我不知道引用这些外部配置文件的正确方法。显然我不能参考配置文件的完整路径。但是相对路径似乎也不是一个选项,因为我不确定这个路径是否应该相对于共享库的位置,或者与共享库链接的可执行文件的位置,或者再次是工作目录可执行文件从中启动。 目前,我的代码如下所示:

void
myImageAnalysisFunctionExportedInASharedLibrary(cv::Mat &input, cv::Mat &output) 
{

   const std::string configurationFile = "resources/analyserConfig.txt";
   Analyser a;
   a.setConfiguration(configurationFile);
   a.analyse(input, output);

}

我正在使用 OpenCV 在 Linux/Windows 环境下使用 C++ 进行编码。我更喜欢不需要参考 Boost 或 Qt 的便携式解决方案。我使用 CMake 作为项目构建环境。

【问题讨论】:

    标签: c++ resources cmake shared-libraries


    【解决方案1】:

    关于目录路径,在 Windows 下,从 %APPDATA% 文件夹中放置并读取您的配置文件...最好在那里创建您自己的子文件夹。对于 Linux,使用 $HOME... 再次在那里创建一个子文件夹,最好在它前面加上句点以使其隐藏。这两者都允许应用程序级别的权限,而应用程序安装位置的相对路径不再允许。

    【讨论】:

    • Qt 有办法获取用户路径。查看 QDesktopServices::storageLocation 以找到放置配置文件的好地方。这将获得在 linux、windows、OSX 上有效的用户路径...doc-snapshot.qt-project.org/4.8/qdesktopservices.html
    • 谢谢。但是您如何在 C++ 代码中引用 %APPDATA% 或 $HOME 呢?还是在 CMake 中? QDesktopServices 可能是合适的,但宁愿不为这个小实用功能引入对完整 Qt 框架的依赖。
    • 您可以使用 stdlib getenv,例如getenv("APPDATA").
    【解决方案2】:

    使用this link 中解释的 CMake 配置文件找到了解决方案。

    我创建了一个模板配置文件config.hpp.in

    #ifndef CONFIG_HPP
    #define CONFIG_HPP
    
    #cmakedefine CLASSIFIER_LOCATION @CLASSIFIER_LOCATION@
    
    #endif
    

    然后我设置文件位置并在我的 CMakeLists.txt 中调用 configure_file:

    set(CLASSIFIER_LOCATION \"${CMAKE_CURRENT_SOURCE_DIR}/resources/toto.txt\")
    CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.hpp.in ${CMAKE_CURRENT_SOURCE_DIR}/config.hpp)
    

    这创建了一个 config.hpp,其中资源文件位置的完整路径已由 cmake 写出。我只需要在需要的地方包含 config.hpp。 示例config.hppLinux

    #ifndef CONFIG_HPP
    #define CONFIG_HPP
    #define CLASSIFIER_LOCATION "/home/vieux/workspace/IllustrationDetection/src/dll/resources/toto.txt"
    
    #endif
    

    【讨论】:

    • 您是否计划在每个目标安装上提供您的源代码并构建您的应用程序?如果没有,我不会编译这个。
    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多