【问题标题】:g++ relative pathsg++ 相对路径
【发布时间】:2011-08-21 00:45:43
【问题描述】:

我正在尝试使用 g++ 设计一个共享库的共享库,希望能够简化我的编译脚本并在未来简化我的更新过程,但我仍然是 GNU 工具和编写库的新手,在那.任何人都可以就 g++ 是否可以实现以下想法提供建议?

为方便起见,请考虑以下文件系统布局:

main.cpp
libraryX/
libraryX/libX.so
libraryX/libraryY/
libraryX/libraryY/libY.so
libraryX/libraryZ/
libraryX/libraryZ/libZ.so

我的目标是能够使用级联相对路径间接链接。例如,main.cpp 链接到 libraryX/libX.so,它链接到 libraryY/libY.so 和 libraryZ/libZ.so。是否可以只将 main.cpp 链接到 libX.so 并使用 libY.so 和 libZ.so 中定义的函数?

如果是这样,您能否提供一个需要这样做的标志示例?我一直在尝试使用来自 Google 的各种来源的以下命令的变体,但无济于事:

g++ -shared -fPIC -Wl-rpath=libraryX -LlibraryX -lX.so main.o -o executable

非常感谢任何指导或参考。

【问题讨论】:

  • 您能否添加更多信息,说明您为什么要这样做?
  • Linux 发行版构建系统一直在删除这种链接技术。使用库 Y 中函数的库和程序应该总是链接 Y。链接 X 导致的 bug 太多了,假设它总是链接 Y,然后 X 的变化意味着 Y 不再链接。
  • @envu:我想要它主要是为了方便,因为我围绕这个概念设计了我的构建脚本。然而,在考虑了一夜之后,考虑到 Zan Lynx 的评论,这种方法的替代方案似乎不仅迫在眉睫,而且在设计方面也更好。

标签: c++ g++ shared-libraries


【解决方案1】:

不要这样做(即使你知道怎么做)。

当您链接到-lX 时,静态链接器必须知道“此链接的一部分”的所有其他共享库。由于-lY 不在链接行上,静态链接器要么给你一个错误,要么它必须以某种方式找出libY.so 的来源。对于后者,它必须复制运行时加载程序将执行的RPATH 搜索。这种复制容易出错(静态链接器可能不使用完全相同的算法)并且最好避免。

最后,您的命令行完全错误:-shared 表示您向链接器请求共享库,但您显然是在尝试链接可执行文件。链接可执行文件时,通常不应使用-fPIC。另外,-Wl-rpath=... 应该是 -Wl,-rpath=...(逗号很重要)。

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 2012-01-11
    • 2010-09-15
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2010-12-17
    相关资源
    最近更新 更多