gpt4 book ai didi

boost - 在测试可执行文件中使用特定类但在生产可执行文件中不使用 Boost 序列化的链接器错误

转载 作者:太空宇宙 更新时间:2023-11-03 21:09:33 25 4
gpt4 key购买 nike

我在 C++ 项目中使用 Boost 1.49、OpenCV 2.3.1、CMake 2.8。

我正在构建两个具有相同头文件的可执行文件,一个用于生产,另一个用于测试。 contest.hpp文件指定:

namespace boost
{
namespace serialization
{

template<class Archive>
void serialize(Archive& ar, cv::Point& p, const unsigned int version);

template<class Archive>
void serialize(Archive& ar, cv::Rect_<int>& r, const unsigned int version);

template<class Archive>
void serialize(Archive& ar, cv::Size_<int>& s, const unsigned int version);
}
}

这些在contest.cpp中实现像这样的文件

namespace boost
{
namespace serialization
{

template<class Archive>
void serialize(Archive& ar, cv::Point& p, const unsigned int version)
{
ar & p.x;
ar & p.y;
}

template<class Archive>
void serialize(Archive& ar, cv::Rect_<int>& r, const unsigned int version)
{
ar & r.x;
ar & r.y;
ar & r.height;
ar & r.width;
}

template<class Archive>
void serialize(Archive& ar, cv::Size_<int>& s, const unsigned int version)
{
ar & s.width;
ar & s.height;
}

}
}

test-contest.cpp平凡地测试这些像

    BOOST_AUTO_TEST_CASE(Serialization1)
{

Point point_write(3, 5);
{
ofstream point_file("Point.txt");
ar::text_oarchive point_archive(point_file);
sr::serialize(point_archive, point_write, 0);
}
Point point_read(0, 0);
{
ifstream point_file("Point.txt");
ar::text_iarchive point_archive(point_file);
sr::serialize(point_archive, point_read, 0);
}
BOOST_CHECK(point_read == point_write);


Rect rect_write(3, 5, 1, 7);
{
ofstream rect_file("Rect.txt");
ar::text_oarchive rect_archive(rect_file);
sr::serialize(rect_archive, rect_write, 0);
}
Rect rect_read(0, 0, 0, 0);
{
ifstream rect_file("Rect.txt");
ar::text_iarchive rect_archive(rect_file);
sr::serialize(rect_archive, rect_read, 0);
}
BOOST_CHECK((rect_read.x) == (rect_write.y) && (rect_read.y) == (rect_write.y));

Size size_write(3, 5);
{
ofstream size_file("Size.txt");
ar::text_oarchive size_archive(size_file);
sr::serialize(size_archive, size_write, 0);
}
Size size_read(0, 0);
{
ifstream size_file("Size.txt");
ar::text_iarchive size_archive(size_file);
sr::serialize(size_archive, size_read, 0);
}
BOOST_CHECK(size_read == size_write);
}

哪里srarcommon.hpp 中定义喜欢

namespace ar = ::boost::archive;
namespace sr = ::boost::serialization;

makefile 是从 CMake 配置生成的,例如:

link_directories(${DEPENDENCY_DIR}/libboost/lib)
link_directories(${DEPENDENCY_DIR}/libopencv/lib)

add_executable(test-contest test-contest.cpp contest.cpp)
add_executable(contest main.cpp contest.cpp)

target_link_libraries(test-contest boost_serialization opencv_core opencv_highgui opencv_imgproc boost_program_options boost_unit_test_framework boost_filesystem)

target_link_libraries(contest boost_serialization opencv_core opencv_highgui opencv_imgproc boost_program_options boost_filesystem)

所以,这个故事的寓意是,contesttest-contest针对相同的 header 进行编译和链接。请注意,其他 Boost 库已成功链接和测试。

说到makecmake 'Unix Makefiles' .. 之后, 对于 contest它说

[ 40%] Building CXX object CMakeFiles/contest.dir/main.cpp.o
[ 60%] Building CXX object CMakeFiles/contest.dir/contest.cpp.o
Linking CXX executable contest
[ 60%] Built target contest

但对于 test-contest

[ 80%] Building CXX object CMakeFiles/test-contest.dir/test-contest.cpp.o
[100%] Building CXX object CMakeFiles/test-contest.dir/contest.cpp.o
Linking CXX executable test-contest
CMakeFiles/test-contest.dir/test-contest.cpp.o: In function `otap::TPageImage::Serialization1::test_method()':
/home/iesahin/Repository/otapexplorer/cli/contest-2012/test-contest.cpp:119: undefined reference to `void boost::serialization::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive&, cv::Rect_<int>&, unsigned int)'
/home/iesahin/Repository/otapexplorer/cli/contest-2012/test-contest.cpp:125: undefined reference to `void boost::serialization::serialize<boost::archive::text_iarchive>(boost::archive::text_iarchive&, cv::Rect_<int>&, unsigned int)'
/home/iesahin/Repository/otapexplorer/cli/contest-2012/test-contest.cpp:133: undefined reference to `void boost::serialization::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive&, cv::Size_<int>&, unsigned int)'
/home/iesahin/Repository/otapexplorer/cli/contest-2012/test-contest.cpp:139: undefined reference to `void boost::serialization::serialize<boost::archive::text_iarchive>(boost::archive::text_iarchive&, cv::Size_<int>&, unsigned int)'
collect2: ld returned 1 exit status
make[2]: *** [test-contest] Error 1

恕我直言,最奇怪的是,serialize(Archive, cv::Point, int) 没有错误它来自 OpenCV 中与 serialize(Archive, cv::Rect_<int>, int) 相同的 header /库或 cv::Size_<int> .它们的序列化/测试函数的定义几乎相同。

我正在链接这些 serialize来自 contest.cpp 的功能归档成功。我尝试更换 RectRect_<int>在定义中,没有变化。我尝试更改 CMakeLists.txt 中库的顺序并采取了boost_serialization从头到尾到现在的地方,都无济于事。

我哪里做错了?

最佳答案

我认为您需要将三个serialize 函数的实现从contest.cpp 移动到contest.hpp

有关原因,请参阅 Why can templates only be implemented in the header file?Why should the implementation and the declaration of a template class be in the same header file?

关于boost - 在测试可执行文件中使用特定类但在生产可执行文件中不使用 Boost 序列化的链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9884796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com