找不到 -lboost_filesystem 和 -lboost_system
cannot find -lboost_filesystem and -lboost_system
我在我的示例程序中使用 boost::filesystem,但出现链接错误。
示例程序如下:
#include<boost/filesystem.hpp>
using namespace std;
int main()
{
string fromPath = "/home/anurag/testfile";
string toPath = "/home/anurag/testfile";
boost::filesystem::copy_file(fromPath,toPath);
return 0;
}
以下是尝试解决此问题的步骤:
1. g++ -g test.cpp -o out -I/apps/rcast/anurag/vendor/RH6.1AS_64/x86_64/boost_1_64_0/
注意:在这个 boost
和 lib
目录中, filesystem.hpp
在 boost/
我在这里遇到链接错误,因为我错过了包含 lboost_system
和 lboost_filesystem
2. 指定 -L 选项并在构建期间指定库:
g++ -g test.cpp -o out -I/apps/rcast/anurag/vendor/RH6.1AS_64/x86_64/boost_1_64_0/ -L/apps/rcast/anurag/vendor/RH6.1AS_64/x86_64/boost_1_64_0/lib/ -lboost_system -lboost_filesystem
错误:
/usr/bin/ld: cannot find -lboost_filesystem
/usr/bin/ld: cannot find -lboost_system
collect2: error: ld returned 1 exit status
3. 在 LD_LIBRARY_PATH 中添加了库路径,即使我在 -L 选项中指定的不是必需的
现在 echo $LD_LIBRARY_PATH
显示 /xenv/gcc_gnu/X/6.1.0/lib64:/apps/rcast/anurag/vecndor/RH6.1AS_64/x86_64/boost_1_64_0/lib
还是一样的错误。
在 boost_1_64_0/lib/
中存在的库是 ls -lart libboost*system*
:
libboost_filesystem-gcc61-mt-sd-1_64.a
libboost_system-gcc61-mt-sd-1_64.a
libboost_filesystem-gcc61-mt-s-1_64.a
libboost_system-gcc61-mt-s-1_64.a
-lboost_filesystem
导致链接器查找名为 libboost_filesystem.a
或 libboost_filesystem.so
的文件,因为您的文件名为 libboost_filesystem-gcc61-mt-s-1_64.a
您需要将 -lboost_filesystem-gcc61-mt-s-1_64
传递给链接器
为 boost 库找到正确的链接器选项可能很痛苦。我建议将其留给 cmake
来整理这些细节。使用此 CMakeLists.txt 文件可以编译您的代码:
cmake_minimum_required(VERSION 3.5)
project (copyfile LANGUAGES CXX)
find_package(Boost REQUIRED COMPONENTS filesystem)
add_executable(${PROJECT_NAME} test)
target_link_libraries(${PROJECT_NAME} Boost::filesystem)
cmake
-辅助编译可以用通常的程序完成:
- 将
CMakeLists.txt
文件添加到包含源代码的目录中
mkdir build && cd build
cmake ..
和 make
请注意,您的代码中有一个 typo/bug:
复制指令应该是
boost::filesystem::copy_file(fromPath,toPath);
^^^^^^^^^^
我在我的示例程序中使用 boost::filesystem,但出现链接错误。
示例程序如下:
#include<boost/filesystem.hpp>
using namespace std;
int main()
{
string fromPath = "/home/anurag/testfile";
string toPath = "/home/anurag/testfile";
boost::filesystem::copy_file(fromPath,toPath);
return 0;
}
以下是尝试解决此问题的步骤:
1. g++ -g test.cpp -o out -I/apps/rcast/anurag/vendor/RH6.1AS_64/x86_64/boost_1_64_0/
注意:在这个 boost
和 lib
目录中, filesystem.hpp
在 boost/
我在这里遇到链接错误,因为我错过了包含 lboost_system
和 lboost_filesystem
2. 指定 -L 选项并在构建期间指定库:
g++ -g test.cpp -o out -I/apps/rcast/anurag/vendor/RH6.1AS_64/x86_64/boost_1_64_0/ -L/apps/rcast/anurag/vendor/RH6.1AS_64/x86_64/boost_1_64_0/lib/ -lboost_system -lboost_filesystem
错误:
/usr/bin/ld: cannot find -lboost_filesystem
/usr/bin/ld: cannot find -lboost_system
collect2: error: ld returned 1 exit status
3. 在 LD_LIBRARY_PATH 中添加了库路径,即使我在 -L 选项中指定的不是必需的
现在 echo $LD_LIBRARY_PATH
显示 /xenv/gcc_gnu/X/6.1.0/lib64:/apps/rcast/anurag/vecndor/RH6.1AS_64/x86_64/boost_1_64_0/lib
还是一样的错误。
在 boost_1_64_0/lib/
中存在的库是 ls -lart libboost*system*
:
libboost_filesystem-gcc61-mt-sd-1_64.a
libboost_system-gcc61-mt-sd-1_64.a
libboost_filesystem-gcc61-mt-s-1_64.a
libboost_system-gcc61-mt-s-1_64.a
-lboost_filesystem
导致链接器查找名为 libboost_filesystem.a
或 libboost_filesystem.so
的文件,因为您的文件名为 libboost_filesystem-gcc61-mt-s-1_64.a
您需要将 -lboost_filesystem-gcc61-mt-s-1_64
传递给链接器
为 boost 库找到正确的链接器选项可能很痛苦。我建议将其留给 cmake
来整理这些细节。使用此 CMakeLists.txt 文件可以编译您的代码:
cmake_minimum_required(VERSION 3.5)
project (copyfile LANGUAGES CXX)
find_package(Boost REQUIRED COMPONENTS filesystem)
add_executable(${PROJECT_NAME} test)
target_link_libraries(${PROJECT_NAME} Boost::filesystem)
cmake
-辅助编译可以用通常的程序完成:
- 将
CMakeLists.txt
文件添加到包含源代码的目录中 mkdir build && cd build
cmake ..
和make
请注意,您的代码中有一个 typo/bug: 复制指令应该是
boost::filesystem::copy_file(fromPath,toPath);
^^^^^^^^^^