代码之家  ›  专栏  ›  技术社区  ›  LuckyM

链接到共享boost库让人头疼

  •  1
  • LuckyM  · 技术社区  · 8 年前

    我有一个问题,听起来很简单,但我觉得我已经尽了一切努力来解决它,我没有想法了。

    #include <boost/program_options.hpp>
    

    这个程序在我的笔记本电脑上运行,现在我正试图将它放到一个服务器上,而我没有sudo特权。在我的笔记本电脑上,我有boost版本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。所以link,我猜这意味着-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.
    

    我用引号和<>,没有“boost/”等,但我总是收到同样的抱怨。我假设这意味着它找到了库,因为没有关于-lboost_program_options标志的投诉?

    当它在我的机器上工作时,我可能根本没有使用共享程序选项库。在我的笔记本电脑上,我的库路径中有一个libboost_program_options的静态版本,它可能正在使用,还有program-options。库外部的hpp头,可能在我的包含路径中。我觉得我应该能够使用服务器上的共享库,而不会第五次打扰服务器管理员(这里的这些东西工作起来非常慢)。

    如果这是我的疏忽,我很抱歉。我是一个新手,但我觉得我已经尽了一切努力来解决这个问题。

    我很乐意接受任何关于如何改变这一点的建议……或者我只是有点愚蠢地使用共享库。

    提前谢谢。

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

    2 回复  |  直到 8 年前
        1
  •  0
  •   Rene    8 年前

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

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

    最后:如果您是针对系统上的Boost共享库进行链接,那么您应该使用与服务器上安装的相同版本的Boost。否则,链接到静态库,这可能会使您的可执行文件更大,但它将在任何服务器上运行,无论安装了什么Boost版本(甚至没有)。

        2
  •  0
  •   Ajinath Kumbhar    4 年前