链接到共享的提升库让人头疼
Linking to shared boost library giving headaches
我有一个听起来很简单的问题,但我觉得我已经尝试了一切来解决它,但我没有想法。
我有一个我写的程序,它使用 boost/program_options.hpp 使用 include 语句
#include <boost/program_options.hpp>
这个程序在我的笔记本电脑上运行,现在我想把它放到我没有 sudo 权限的服务器上。在我的膝上型电脑上,我有 boost 版本 1.56 和 1.58,而在服务器上我找到了 1.53.0。我没有安装或构建它。
服务器上存在的共享库文件是:
/usr/lib64/libboost_program_options.so.1.53.0
运行 ldd on 给我输出:
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)
我认为这意味着它已找到所有依赖项。
我已经在我的主目录中创建了一个符号 link 以创建一个 libboost_program_options.so link,我猜这意味着 -lboost_program_options linker 标志应该可以。
我的编译方式是:
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 header 可能在我的包含路径中。我觉得我应该能够使用服务器上的共享库,而不是第 5 次惹恼服务器管理员(这里的这些东西工作起来真的很慢)。
如果这是我的疏忽,我很抱歉。我对 boost 还很陌生,但我觉得我现在已经尝试了一切来自己解决这个问题。
我很乐意就如何更改此设置提出任何建议...或者如果我只是在使用共享库方面有点愚蠢。
提前致谢。
编辑:
经过更多研究后,我觉得我只是对静态库和共享库感到困惑。我试图在编译时 link 一个共享库,我想这没有意义。还包含一些不应在编译时 linked 的 header 文件是没有意义的。我的代码明明是为静态库设计的
错误消息是由预编译器生成的,它没有找到 Boost 头文件(如错误消息中所述)。您需要在找到 Boost 库头文件的位置设置正确的包含路径 (-I...
),显然它们不在 /usr/include
.
下
必须相应地指定 Boost 库 (-L...
) 的路径。
最后:如果您link使用系统上的 Boost 共享库,那么您应该使用与服务器上安装的相同版本的 Boost。否则,link 反对静态库,这可能会使您的可执行文件更大,但它会 运行 在任何服务器上,无论那里安装的 Boost 版本如何(甚至 none)。
sudo apt 安装 libboost-program-options-dev
我有一个听起来很简单的问题,但我觉得我已经尝试了一切来解决它,但我没有想法。
我有一个我写的程序,它使用 boost/program_options.hpp 使用 include 语句
#include <boost/program_options.hpp>
这个程序在我的笔记本电脑上运行,现在我想把它放到我没有 sudo 权限的服务器上。在我的膝上型电脑上,我有 boost 版本 1.56 和 1.58,而在服务器上我找到了 1.53.0。我没有安装或构建它。
服务器上存在的共享库文件是: /usr/lib64/libboost_program_options.so.1.53.0
运行 ldd on 给我输出:
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)
我认为这意味着它已找到所有依赖项。
我已经在我的主目录中创建了一个符号 link 以创建一个 libboost_program_options.so link,我猜这意味着 -lboost_program_options linker 标志应该可以。
我的编译方式是:
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 header 可能在我的包含路径中。我觉得我应该能够使用服务器上的共享库,而不是第 5 次惹恼服务器管理员(这里的这些东西工作起来真的很慢)。
如果这是我的疏忽,我很抱歉。我对 boost 还很陌生,但我觉得我现在已经尝试了一切来自己解决这个问题。
我很乐意就如何更改此设置提出任何建议...或者如果我只是在使用共享库方面有点愚蠢。
提前致谢。
编辑: 经过更多研究后,我觉得我只是对静态库和共享库感到困惑。我试图在编译时 link 一个共享库,我想这没有意义。还包含一些不应在编译时 linked 的 header 文件是没有意义的。我的代码明明是为静态库设计的
错误消息是由预编译器生成的,它没有找到 Boost 头文件(如错误消息中所述)。您需要在找到 Boost 库头文件的位置设置正确的包含路径 (-I...
),显然它们不在 /usr/include
.
必须相应地指定 Boost 库 (-L...
) 的路径。
最后:如果您link使用系统上的 Boost 共享库,那么您应该使用与服务器上安装的相同版本的 Boost。否则,link 反对静态库,这可能会使您的可执行文件更大,但它会 运行 在任何服务器上,无论那里安装的 Boost 版本如何(甚至 none)。
sudo apt 安装 libboost-program-options-dev