C++ BOOST 未定义引用`boost::filesystem::detail::copy_file
C++ BOOST undefined reference to `boost::filesystem::detail::copy_file
我不知道为什么 boost::filesystem::copy_file
找我麻烦。
undefined reference to `boost::filesystem::detail::copy_file
// g++ -std=c++11 test.cpp -lboost_filesystem -lboost_system -lrt -lboost_wave
#include <boost/filesystem.hpp>
int main()
{
boost::filesystem::create_directory("aaa");
// ok
boost::filesystem::copy_file("f1","f2");
// /tmp/ccNWZltB.o: In function `boost::filesystem::copy_file(boost::filesystem::path const&, boost::filesystem::path const&)':
// test.cpp:(.text._ZN5boost10filesystem9copy_fileERKNS0_4pathES3_[_ZN5boost10filesystem9copy_fileERKNS0_4pathES3_]+0x26): undefined reference to `boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option, boost::system::error_code*)'
// collect2: error: ld returned 1 exit status
return 0;
}
我没有从 boost 的源代码或它的源代码中得到灵感 help:
inline
void copy_file(const path& from, const path& to, // See ticket #2925
BOOST_SCOPED_ENUM(copy_option) option, system::error_code& ec)
{detail::copy_file(from, to, option, &ec);}
即使是这样的 simple example 也不适合我。
平台:Linux Ubuntu 64
这个问题有一个解决方法,替换
#include <boost/filesystem.hpp>
与
#define BOOST_NO_CXX11_SCOPED_ENUMS
#include <boost/filesystem.hpp>
#undef BOOST_NO_CXX11_SCOPED_ENUMS
或者,最好将 -DBOOST_NO_CXX11_SCOPED_ENUMS
添加到您的编译器标志中
我也无法编译包含 header boost/filesystem.hpp
的文件。这就是我解决它的方法:我注释掉行 boost/filesystem.hpp
和所有使用 Boost 的行,然后编译文件。然后我取消注释文件中的所有行并再次编译,然后它工作了。我两次都使用标志 -lboost_system
进行编译!
如果您 运行 遇到此问题,请确保在调用 g++
时同时包含 -lboost_system
和 -lboost_filesystem
工作 Makefile 示例
BINARY = output
FILE_OBJECTS = main.o fileLoader.o
BOOST = -lboost_system -lboost_filesystem
GCC = g++ -std=c++17
FLAGS = -Wall -pedantic -Wextra
build: $(FILE_OBJECTS)
$(GCC) $(FLAGS) $(FILE_OBJECTS) -o $(BINARY) $(BOOST)
main.o: main.cpp fileLoader.o
$(GCC) $(FLAGS) -c main.cpp
fileLoader.o: fileLoader.cpp
$(GCC) $(FLAGS) -c fileLoader.cpp
clean:
rm -rf *.o $(BINARY)
示例工作代码
#include <boost/filesystem.hpp>
void create_data_file(std::string file_path)
{
boost::filesystem::path p(file_path);
boost::filesystem::create_directory(p);
}
在旧的 boost 版本中它是 BOOST_NO_SCOPED_ENUMS
,而不是 BOOST_NO_CXX11_SCOPED_ENUMS
见boost::filesystem::copy_file() missing symbol in c++11
我不知道为什么 boost::filesystem::copy_file
找我麻烦。
undefined reference to `boost::filesystem::detail::copy_file
// g++ -std=c++11 test.cpp -lboost_filesystem -lboost_system -lrt -lboost_wave
#include <boost/filesystem.hpp>
int main()
{
boost::filesystem::create_directory("aaa");
// ok
boost::filesystem::copy_file("f1","f2");
// /tmp/ccNWZltB.o: In function `boost::filesystem::copy_file(boost::filesystem::path const&, boost::filesystem::path const&)':
// test.cpp:(.text._ZN5boost10filesystem9copy_fileERKNS0_4pathES3_[_ZN5boost10filesystem9copy_fileERKNS0_4pathES3_]+0x26): undefined reference to `boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option, boost::system::error_code*)'
// collect2: error: ld returned 1 exit status
return 0;
}
我没有从 boost 的源代码或它的源代码中得到灵感 help:
inline
void copy_file(const path& from, const path& to, // See ticket #2925
BOOST_SCOPED_ENUM(copy_option) option, system::error_code& ec)
{detail::copy_file(from, to, option, &ec);}
即使是这样的 simple example 也不适合我。
平台:Linux Ubuntu 64
这个问题有一个解决方法,替换
#include <boost/filesystem.hpp>
与
#define BOOST_NO_CXX11_SCOPED_ENUMS
#include <boost/filesystem.hpp>
#undef BOOST_NO_CXX11_SCOPED_ENUMS
或者,最好将 -DBOOST_NO_CXX11_SCOPED_ENUMS
添加到您的编译器标志中
我也无法编译包含 header boost/filesystem.hpp
的文件。这就是我解决它的方法:我注释掉行 boost/filesystem.hpp
和所有使用 Boost 的行,然后编译文件。然后我取消注释文件中的所有行并再次编译,然后它工作了。我两次都使用标志 -lboost_system
进行编译!
如果您 运行 遇到此问题,请确保在调用 g++
时同时包含-lboost_system
和 -lboost_filesystem
工作 Makefile 示例
BINARY = output
FILE_OBJECTS = main.o fileLoader.o
BOOST = -lboost_system -lboost_filesystem
GCC = g++ -std=c++17
FLAGS = -Wall -pedantic -Wextra
build: $(FILE_OBJECTS)
$(GCC) $(FLAGS) $(FILE_OBJECTS) -o $(BINARY) $(BOOST)
main.o: main.cpp fileLoader.o
$(GCC) $(FLAGS) -c main.cpp
fileLoader.o: fileLoader.cpp
$(GCC) $(FLAGS) -c fileLoader.cpp
clean:
rm -rf *.o $(BINARY)
示例工作代码
#include <boost/filesystem.hpp>
void create_data_file(std::string file_path)
{
boost::filesystem::path p(file_path);
boost::filesystem::create_directory(p);
}
在旧的 boost 版本中它是 BOOST_NO_SCOPED_ENUMS
,而不是 BOOST_NO_CXX11_SCOPED_ENUMS
见boost::filesystem::copy_file() missing symbol in c++11