创建虚拟共享对象(.so)以依赖其他共享对象

时间:2009-09-16 02:44:56

标签: c++ boost linker

我正在尝试创建一个共享对象(.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库相同的目录中后,我尝试用它编译测试程序(取决于{{1} }):

-lboost_date_time-gcc43-mt

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

3 个答案:

答案 0 :(得分:1)

你没有。不管怎样,不是真的。

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

你可以通过写一个linker script来解决这个问题,它会声明你需要的所有符号作为EXTERN()依赖项。但这意味着您需要列出所需符号的所有受损名称。 IMO根本不值得努力。

答案 1 :(得分:1)

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

FIND_PACKAGE(Boost 1.37 COMPONENTS date_time filesystem REQUIRED)
ADD_EXECUTABLE(myexecutable ${myexecutable_SRCS}) 
TARGET_LINK_LIBRARIES(myexecutable ${Boost_LIBRARIES}) 

上面的命令(如果放在“CMakeLists.txt”文件中)就是您所需要的:

     
  1. 确认安装了Boost 1.37或更高版本,并安装了“date_time”和“filesystem”库。
  2.  
  3. 从相应变量中列出的来源创建名为“myexecutable”的可执行文件。
  4.  
  5. 将可执行文件“myexecutable”与boost“date_time”和“filesystem”库链接。
  6. 另请参阅:Why the KDE project switched to CMake

答案 2 :(得分:1)

实际上,制作一个.so依赖于所有提升.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就好了,但在解析应用程序的符号时会被忽略。