2016-06-20 44 views
1

我有一个使用boost记录库的Qt应用程序。我想让它成为独立的。但是,在我管理静态链接的库之后,应用程序仍依赖于boost库。 我包括的库是:Boost Logger静态链接:不工作

..../boost_1_61_0_b1/stage/lib/libboost_regex.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_log_setup.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_thread.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_log.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_system.a 
    ..../boost_1_61_0_b1/stage/lib/libboost_filesystem.a 

应用编译(无数尝试之后)。但是,当我使用ldd工具时,它显示依赖项列表上的boost库。

注意:我必须定义BOOST_ALL_DYN_LINK。否则,它不会链接。

有没有办法不使用这个宏并克服依赖性问题?如果不是,你建议采取什么解决方案来解决这个问题?

+1

首先将所有boost库编译为静态库。我很确定你可以使用一个bjam选项。 –

+0

但是我在/ stage/libs下同时安装了.a和.so文件。我应该把它们分开吗? –

回答

0

默认情况下,在现代类UNIX系统中默认情况下gcc与共享库链接。为了强制静态链接,您可以将-static添加到链接命令行(请参阅docs),或者确保gcc找不到共享库,但仅查找静态库(例如,将共享库移动到单独的目录'重新链接你的项目)。请注意,-static将使所有库静态链接,包括libstdC++。

或者,您可以直接指定静态库,而不使用-l开关。你将不得不虽然使用的完整路径库,所以不是

gcc ... -lboost_log ...

你会写

gcc ... ..../boost_1_61_0_b1/stage/lib/libboost_log.a ...

在任何情况下,你应该定义BOOST_ALL_DYN_LINK,因为这个宏意味着完全相反 - 你打算链接升压共享图书馆。

+0

我试过bjam -static然后我链接到.a库,它工作。我不知道这是一个Qt .pro问题还是什么,但似乎当同一路径中同时存在.a和.so库时,即使指定了其他库,它也会链接到.so。不管怎么说,多谢拉 –