【问题标题】:Creating dummy shared object (.so) to depend on other shared objects创建虚拟共享对象 (.so) 以依赖其他共享对象
【发布时间】:2009-09-16 02:44:55
【问题描述】:

我正在尝试创建一个共享对象 (.so),通过在 -lboost 中包含一个共享对象,我会隐式包含所有 boost 库。这是我尝试过的:

#!/bin/sh
BOOST_LIBS="-lboost_date_time-gcc43-mt -lboost_filesystem-gcc43-mt"
  #truncated for brevity
g++ $BOOST_LIBS -shared -Wl,-soname,libboost.so.1 -o libboost.so.1.0
ln -si libboost.so.1.0 libboost.so.1
ln -si libboost.so.1 libboost.so

将所有 3 个创建的文件(libboost.so libboost.so.1 libboost.so.1.0)与所有 boost 库放在同一目录中后,我尝试用它编译一个测试程序(这取决于 -lboost_date_time-gcc43-mt) :

g++ -lboost test.cpp

这样做,我得到了与没有 -lboost 相同的未定义参考消息。有-lboost_date_time-gcc43-mt works,但这太罗嗦了:) 如何让 -lboost 自动引入其他共享库?

【问题讨论】:

  • 更新:运行 objdump -x libboost.so | grep NEEDED 给出了这个: 需要 libboost_date_time-gcc43-mt-1_38.so.1.38.0 需要 libboost_filesystem-gcc43-mt-1_38.so.1.38.0 需要 /boot/develop/lib/x86/libstdc++.so 需要 libroot.so (请注意,我正在运行 Haiku)

标签: c++ boost linker


【解决方案1】:

你没有。反正也不是。

链接器正在剥离所有符号依赖项,因为 .so 不使用它们。

您可以通过编写linker script 来解决这个问题,将您需要的所有符号声明为EXTERN() 依赖项。但这意味着您需要列出所需符号的所有错误名称。完全不值得付出努力,IMO。

【讨论】:

  • 啊,所以我想我必须编写一些代码来引用依赖项中的每个符号,或者更确切地说,使用一种不会剥离依赖项的理智方法?或者创建虚拟 .so 几乎是不可能的?
  • 好的,谢谢。我想我会在构建时设置一个方便的环境变量:g++ $lboost alive.cpp
  • 如果你还没有使用 Makefile,你应该这样做。您可能还想考虑使用自动配置工具。这将使开发变得更加容易。
  • --no-as-needed 解决了我试图创建虚拟/存根共享库的问题
【解决方案2】:

我没有创建虚拟“.so”的解决方案,但我确实有一些可以简化你的生活的东西......我强烈建议你尝试使用跨平台制作 (CMake)。在 CMake 中,链接这些库很容易:

FIND_PACKAGE(需要提升 1.37 组件 date_time 文件系统) ADD_EXECUTABLE(myexecutable ${myexecutable_SRCS}) TARGET_LINK_LIBRARIES(myexecutable ${Boost_LIBRARIES})

上面的命令,如果放在“CMakeLists.txt”文件中,你只需要:

  1. 验证是否安装了 Boost 1.37 或更高版本,并安装了“date_time”和“filesystem”库。
  2. 从相应变量中列出的源创建一个名为“myexecutable”的可执行文件。
  3. 将可执行文件“myexecutable”与 boost“date_time”和“filesystem”库相关联。

另请参阅:Why the KDE project switched to CMake

【讨论】:

    【解决方案3】:

    实际上,使一个 .so 依赖于所有 boost .so 文件是很有可能的(但实际上可能对您没有帮助)。我刚刚试过这个:

    $ export BOOST_ROOT=/home/ghost/Work/Boost/boost-svn
    $ g++ -shared -Wl,-soname,libboost.so -o libboost.so $BOOST_ROOT/stage/lib/libboost_program_options.so
    $ g++ -L . -I $BOOST_ROOT first.cpp -lboost -Wl,-R$BOOST_ROOT/stage/lib
    $ LD_LIBRARY_PATH=.:$BOOST_ROOT/stage/lib ./a.out
    

    它确实奏效了。但是,请注意与 -R 和 LD_LIBRARY_PATH 共舞。我不知道如何在 libboost.so 中包含 Boost .so 的路径,以便它们用于链接和实际运行应用程序。我可以在 libboost.so 中包含 rpath 就好了,但是在为应用程序解析符号时它会被忽略。

    【讨论】:

      猜你喜欢
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      相关资源
      最近更新 更多