使用boost::文件系统时无法链接
Cannot link when using boost::filesystem
我正在尝试使用boost::filesystem::exists函数。当我尝试链接时,我会得到
/usr/local/include/boost/filesystem/operations.hpp:289: undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
错误。
我在谷歌上搜索了一段时间,只找到了"与助推链接"的答案。在我的情况下,为链接器指定了-lbox_system和-lbox_filesystem,但似乎不起作用。实际上,我可以使用boost::filesytem::path(例如),但当我尝试使用任何需要boost/filesystem.hpp头的东西时,我会遇到链接器错误。有什么想法吗?
附言:我使用的是从repos安装的gcc-4.6.4和boost lib,但我认为gcc-4.6.4.是我的ubuntu 12.04的默认gcc版本。我想我不需要从源代码编译boost?
链接器(ld)有很多选项可以指定解析共享库的搜索路径,man ld
将为您提供所有选项。假设您在/usr/local/lib
中安装了boost,您可以将其中一个选项添加到gcc以传递到链接器:
-
-L=/usr/local/lib
在命令行中指定的目录将在默认目录之前进行搜索。所有-L选项应用于所有-L选项,而不考虑选项的显示顺序。如果searchdir以"="开头,则"="将被sysroot前缀取代,sysroot前缀是配置链接器时指定的路径。-L选项仅设置编译时库搜索路径;如果希望在运行时找到共享库,则必须在运行时知道其目录。
-
-Wl、-rpath、/usr/local/lib
将目录添加到运行库搜索路径。这在链接ELF可执行文件和共享对象时使用。所有-rpath参数都连接起来并传递给运行时链接器,后者在运行时使用它们来定位共享对象。-rpath选项也用于定位链接中明确包含的共享对象所需的共享对象;请参阅-rpath链接选项的说明。如果在链接ELF可执行文件时不使用-rpath,则在定义环境变量"LD_RUN_PATH"时将使用该变量的内容。
另一种选择是将提升库的位置添加到LD_LIBRARY_PATH
中。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
链接器(ld)使用LD_LIBRARY_PATH
作为搜索路径之一来定位所需的共享库。
您可以在此处阅读有关链接器和共享库的更多信息。
要完全理解为什么您的安装在默认情况下找不到提升库,您可以在stackexchange上找到这个答案。
这个SO答案建议使用boost m4。
- 无法链接文件系统库C++
- 如何在C++中链接 .a 文件
- 在为 Java 编译动态链接文件时,我应该选择哪些 g++ 参数
- Makefile 将在文件更改时链接文件,但不会重新编译更改的源文件
- CMake 从子目录和父目录链接文件
- 如何将GCC链接器固定地址添加到链接文件中
- 在GCC中链接.h文件
- 使用GDB中的多个链接文件进行调试
- visualstudio2010表达了不同项目中的链接文件
- 编译器是否会优化未使用的链接文件
- 尝试取消链接文件时编译 C++ 时出错
- 链接文件错误,VS 2015中的错误LNK2005
- 用C++中的链接文件编译错误
- Makefile未链接.o文件
- 如何链接.h文件中声明为extern的函数,以创建.dll文件
- 通过makefiles链接文件
- 未定义的引用错误,即使在链接c文件之后
- 多个链接c++文件
- 使用CMakeLists.txt链接c++文件
- 在c++中链接文件