2016-12-14 70 views
1

我有一个问题,听起来令人讨厌的简单,但我觉得我已经尝试了一切来解决它,我出来的想法。链接到共享助推库令人头痛

我有一个程序,我写使用包括声明其采用升压/ program_options.hpp

#include <boost/program_options.hpp> 

该程序适用于我的笔记本电脑,现在我试图把它放到哪里我不知道一个服务器有sudo特权。在我的笔记本电脑上,整个工作的地方,我有升级版本1.56和1.58,在服务器上我发现1.53.0。我没有安装或建立这个。

服务器上存在的共享库文件是: /usr/lib64/libboost_program_options.so.1.53.0

运行上LDD给我的输出:

ldd /usr/lib64/libboost_program_options.so.1.53.0 
linux-vdso.so.1 => (0x00007ffc54a63000) 
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fc0dcad8000) 
libm.so.6 => /lib64/libm.so.6 (0x00007fc0dc7d5000) 
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc0dc5bf000) 
libc.so.6 => /lib64/libc.so.6 (0x00007fc0dc1fe000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fc0dd071000) 

我哪假设意味着它找到了它的所有依赖关系。

我已经做了一个符号链接到我的主目录来创建一个libboost_program_options.so链接,我猜这意味着-lboost_program_options链接器标志应该工作。

我编译的方法是:

g++ -L/home/homeDir code.cpp -o code.o -std=c++11 -Wall -lboost_program_options 

和所有我得到的是:

fatal error: boost/program_options.hpp: No such file or directory 
#include "boost/program_options.hpp" 
            ^
compilation terminated. 

我已经与报价和<>想这一点,并没有 “升压/” 等,但我总是得到同样的投诉。我认为这意味着它找到了库,因为没有关于-lboost_program_options标志的投诉?

虽然它适用于我的机器,但我可能根本没有使用共享程序选项库。在我的笔记本电脑上,我的库路径中可能使用了libboost_program_options的静态版本,以及可能位于我的include路径中的库外的program_options.hpp头。我觉得我应该能够使用服务器上的共享库,而不是惹恼第五次服务器管理员(事情在这里真的很慢)。

对不起,如果这是我的疏忽。我很兴奋,但我觉得现在我已经尝试了一切来解决这个问题。

我很乐意提供任何有关如何改变这种情况的建议......或者如果我只是在使用共享库时感到有点愚蠢。

在此先感谢。

编辑: 经过更多的研究,我觉得我只是在静态和共享库之间感到困惑。我试图在编译时链接一个共享库,我认为这没有意义。还包括在编译时不应该链接的东西的头文件没有什么意义。我的代码显然是为静态库设计的。

+1

'g ++ -I/usr/include -L/usr/lib64 -lboost_program_options -std = C++ 11 ...' –

+0

您的服务器可能没有'program_options.hpp',它应该在一些名为boost_program_options _ ** devel **的软件包。 – Mine

+0

是的,那是我的问题。我想我可以没有它,但似乎并非如此。我现在只是在我的笔记本电脑上链接了一个静态版本的程序选项,并使用服务器上的可执行文件。它工作到目前为止..但我觉得我应该能够得到这个在服务器上编译以及。我现在已经下载了头文件,它决定它找不到libboost_program_options.so,尽管我已经创建了一个符号链接到我正在运行的同一个目录中...好玩^^ – LuckyM

回答

0

错误消息是由预编译器生成的,它没有找到Boost头文件(如错误消息中所述)。您需要设置找到Boost库头文件的正确包含路径(-I...),显然它们不在/usr/include之下。

必须相应地指定Boost库(-L...)的路径。

最后:如果您正在链接系统上的Boost共享库,那么您应该使用与服务器上安装的Boost相同版本的Boost。否则,请与静态库链接,这可能会使您的可执行文件变大,但它可以在任何服务器上运行,而不管在那里安装了何种Boost版本(甚至没有)。

+0

因此要澄清,要使用boost程序选项我需要头文件和共享库对象?我认为共享库对象可能包含头文件和我想调用的函数的代码。我之前没有清楚地使用共享库... 我正在重新编译时切换到服务器,但它可能是一个好主意,只是链接到我的系统上的静态库并使用服务器上的可执行文件。这可能会节省很多痛苦。 – LuckyM

+0

谢谢,我只是下载头文件,现在我有一个错误,我可以更好地工作。无法找到-lboost_program_options。奇怪要对一个错误感到高兴。但至少我在网上某个地方见过这个。 – LuckyM

+0

要进行编译,您需要头文件和共享库。要运行该程序,您只需要共享库。实际上,如果需要共享库中的真正符号,则只需要共享库,但Boost库中的许多内容仅在头文件中,因此直接编译到您的可执行文件中。 – Rene