2009-09-16 71 views
3

我想创建一个共享对象(.so),通过包含一个共享对象-lboost,我隐式地包含所有的提升库。下面是我的尝试:创建虚拟共享对象(.so),以依赖于其他共享对象

#!/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自动引入其他共享库?

+0

更新:运行objdump -x libboost.so | grep的NEEDED给出了这样的: 的必需libboost_date_time-gcc43-MT-1_38.so.1.38.0 NEEDED libboost_filesystem-gcc43-MT-1_38.so.1.38.0 的必需/boot/develop/lib/x86/libstdc++.so 需要libroot。所以 (注意,我正在运行Haiku) – 2009-09-16 03:07:42

回答

1

你不知道。无论如何,并非如此。

链接器剥离掉所有的符号依赖关系,因为.so不使用它们。

您可以通过编写一个linker script来解决这个问题,它可以将所有需要的符号声明为EXTERN()依赖关系。但是这意味着你需要列出你需要的所有符号。国际海事组织一点也不值得。

+0

啊,所以我想我必须编写一些引用依赖关系中每个符号的代码,或者使用一种不会剥夺依赖关系的理智方法?或者正在创造虚拟。这几乎是不可能的? – 2009-09-16 03:17:40

+0

好的,谢谢。我想我只是建立一个方便的环境变量来建设:g ++ $ lboost alive.cpp – 2009-09-16 03:56:20

+0

如果你还没有使用Makefiles,你应该。您可能还想考虑使用自动配置工具。这将使开发更容易。 – greyfade 2009-09-16 06:10:58

1

我没有创建虚拟'.so'的解决方案,但我确实有一些将简化您的生活的东西...我强烈建议您尝试使用跨平台制作(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. 验证升压1.37或更高版本安装了“date_time”和“filesystem”库。
  2. 从相应变量中列出的来源创建一个名为“myexecutable”的可执行文件。
  3. 将可执行文件“myexecutable”与boost“date_time”和“filesystem”库链接起来。

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

1

其实,制作一个.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,但是在为应用程序解析符号时忽略它。