我正在尝试创建一个共享对象(.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自动引入其他共享库?
答案 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”文件中)就是您所需要的:
答案 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就好了,但在解析应用程序的符号时会被忽略。