【问题标题】:Conan is looking for libA.so.1 instead of libA.so柯南正在寻找 libA.so.1 而不是 libA.so
【发布时间】:2021-06-10 17:43:31
【问题描述】:

我正在用柯南打包libA 共享库。它正确构建。我的test_package 包正确复制了libA.so 文件。

然后,当它运行时,柯南给了我错误

./example: erro rwhile loading shared libraries: libA.so.1: cannot open shared object file: No such file or directory

这是因为文件是libA.so,而不是libA.so.1。当我将 libA.so 重命名为 libA.so.1 并运行 ./example 时,整个过程都可以正常工作。

libA conanfile.pypackage_info 中,我确实有

self.cpp_info.libs = ["libA.so"]

我也试过

self.cpp_info.libs = ["A"]

但两者都不起作用。

如何让我的测试包寻找libA.so,而不是libA.so.1

【问题讨论】:

  • 请显示minimal reproducible examplelibA 可能将其soname 设置为libA.so.1,所以这就是链接器(与柯南无关)在与libA.so 链接时插入到您的可执行文件中的内容
  • 只使用 ["A"] 就足够了,不要使用全名。您似乎只复制了 libA.so,它是 libA.so.1 的符号链接。问题不在于柯南,而在于你如何建立你的图书馆以及你正在复制什么。您可以使用 self.copy("libA.*", dst="lib", ...) 复制所有内容,包括符号链接。

标签: c++ conan


【解决方案1】:

我在打包步骤中这样做了

self.copy("*.h", dst="include", src="src", keep_path=False)
self.copy("*.so", dst="lib", keep_path=False)
tools.rename("src/libA.so", "src/libsA.so.1")
self.copy("src/libA.so.1", dst="lib", keep_path=False)

libA 的 makefile 确实将 libA.so.1 设置为 soname。所以我把.so文件复制了两次;一次为.so,一次为.so.1libA 附带的makefile 没有生成自己的.so.1。这就是为什么我需要制作副本。我觉得这不是执行此操作的最佳方式,但它确实有效。

更新:

现在我正在使用

self.copy("*.h", dst="include", src="src", keep_path=False)
os.symlink("libA.so", "libA.so.1")
self.copy("libA.so*", dst="lib", symlinks=True, keep_path=False)

【讨论】:

  • 你应该做一个符号链接而不是复制文件
  • 或者理想情况下libA.so应该是符号链接,libA.so.1是实际文件
  • 您的方法可能有效,感谢分享,但推荐的方法是使用符号链接。你在 python 中有os.symlink(),你可以在你的食谱中使用。
  • 我的理解是,按照惯例,当你编译你的程序时,它会抓取 soname(链接)并保存它。在这种情况下,soname 是.so.1。真正的.so.1 是指向最新的向后兼容文件(例如.so.1.5.6)的符号链接,其中包含共享对象本身。在这种情况下,他们从来没有给我.so.1.5.6 文件,只有带有对象的.so 文件。所以我必须使.so.1 成为指向具有共享对象的.so 文件的符号链接。该程序将链接到.so,获取.so.1 的soname,然后访问.so.1,这会返回到.so。这是正确的吗?
  • @AlanBirtles 如果我这样做了,那么我的库将如何链接到libA?它会尝试获取libA 的soname,然后失败,因为libA 是一个符号链接,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2020-07-27
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 2018-09-17
相关资源
最近更新 更多