GTSAM Segfault-可能的对齐问题



我正在尝试使用GTSAM。我有以下示例类:

GraphManager.h

#pragma once
#include <gtsam/navigation/CombinedImuFactor.h>
using namespace gtsam;
class GraphManager
{
public:
GraphManager();

private:
std::shared_ptr<PreintegratedCombinedMeasurements> preint;
};

GraphManager.cpp

#include <gtsam_fusion/GraphTest.h>
GraphTest::GraphTest()
{
auto imuParams = PreintegratedCombinedMeasurements::Params::MakeSharedD();
preint = std::make_shared<PreintegratedCombinedMeasurements>(imuParams);
}

以及以下测试案例:

#include <gtsam_fusion/GraphManager.h>
#include <gtest/gtest.h>
#include <iostream>

TEST(GraphManagerTest, test1)
{
VILFusion::GraphManager manager;
EXPECT_TRUE(false) << "1"; // This is just here to prove that `manager` was constructed.
}
int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

当我运行测试时;1〃;消息,所以我知道GraphManager对象已成功初始化。然而,在那之后,测试用例会出现segfault。通过调试,我认为这发生在preint共享指针的析构函数中,但我没有足够的调试经验来确定。

我觉得奇怪的是:如果我将GraphManager的构造函数的实现移到头文件中,它就不再是segfault了。当我删除代码以达到这个最小可行的例子时,它有时会起作用,看起来是随机的,尽管我删除的代码与preint共享指针无关。

我在GTSAM文档中发现了这个gtsam::make_shared函数,这似乎表明对齐可能是一个问题。这也符合我的观察,即更改不相关的代码可能会使segfault出现和消失。但是,在GTSAM的这个示例代码中,PreintegratedCombinedMeasurements没有使用特殊的gtsam::make_shared函数。这个例子是不是不正确,只是偶然发生的?还是gtsam::make_shared功能在这里没有必要,而对齐实际上不是问题?是否有更多关于何时以及如何使用特殊gtsam::make_shared函数的文档?

如果重要的话:我是在ROS节点的上下文中做这件事的,所以我使用catkin作为我的构建系统。然而,这个问题在代码中根本没有引用ROS或使用任何ROS库的情况下发生。

更新:如果我完全放弃共享指针,只生成PreintegratedCombinedMeasurements类型的preint,问题仍然存在。

经过更多的测试,当我放弃Catkin,只做了一个基本的CMake测试项目时,我发现这个问题并不存在,所以问题一定是Catkin或我对Catkin的配置。

Catkin的默认CMakeLists包括每个目标的以下行:

add_dependencies(${PROJECT_NAME}_lib ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

我删除了这行,还从target_link_libraries(...)中删除了${catkin_LIBRARIES}。这解决了问题。

我不知道为什么这解决了问题,所以我不会把这个答案标记为已接受,除非有人能给出解释。

相关内容

  • 没有找到相关文章

最新更新