【问题标题】:How can I resolve relative paths from within a snap package?如何从 snap 包中解析相对路径?
【发布时间】:2017-09-15 00:27:26
【问题描述】:
name: my-lib
apps:
  library-sample:
    command: library_sample $SNAP/arg_file.json

parts:
  library:
    source: https://github.com/the/sample.git
    plugin: cmake
    install: |
      cp -r samples/library_sample $SNAPCRAFT_PART_INSTALL/
      cp -r ../src/samples/src/arg_file.json $SNAPCRAFT_PART_INSTALL/
      cp --parents modules/dep_lib1/libdep_lib1.so $SNAPCRAFT_PART_INSTALL/
      cp --parents modules/dep_lib2/libdep_lib2.so $SNAPCRAFT_PART_INSTALL/

当我创建这个快照时,我可以运行my-lib.library_sample。但是,当示例尝试使用相对路径加载依赖库时,使用路径 ./modules/dep_lib1/libdep_lib1.so 会失败

我的安装文件夹看起来和我预期的一样:

parts/library/install/
|-- arg_file.json
|-- library-sample
|-- include
|   |-- ...
|-- lib
|   |-- ...
|-- modules
    |-- dep_lib1
    |   |-- libdep_lib1.so
    |-- dep_lib2
        |-- libdep_lib2.so

如果您查看library-sample:command:,您会发现我需要在相对路径前加上$SNAP 前缀,以便让样本正确加载arg_file.json。但是,我无法在参数文件中为依赖库指定相对路径。

如何从 snap 包中解析相对路径?

【问题讨论】:

  • 我没有看到任何问题——相对路径应该可以正常工作。库究竟是如何加载的?发生了什么错误?
  • dlopen("./modules/dep_lib1/libdep_lib1.so", RTLD_LAZY);
  • 我相信dlopen 中的相对路径是相对于当前工作目录的,而不是调用它的二进制文件的位置。
  • @Kyle 你是对的!谢谢你。我不会自己解决这个问题。把它放在答案中,我会给你打勾。

标签: snapcraft


【解决方案1】:

dlopen 中的相对路径是相对于当前工作目录的,而不是调用它的二进制文件的位置。请务必考虑到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2014-01-30
    • 2019-02-23
    • 2010-10-03
    相关资源
    最近更新 更多