我正在尝试使用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对象已经成功初始化。但是,在此之后,测试用例出现了分段错误。通过调试,我认为这发生在preint共享指针的析构函数中,但我没有足够的调试经验来确定。
让我感到奇怪的是:如果我将GraphManager的构造函数的实现移到头文件中,它就不再是分段错误了。当我删除代码以达到这个最小可行的示例时,它有时会工作,看起来是随机的,尽管我要删除的代码与preint共享指针无关。
我在GTSAM文档中找到了函数,这似乎表明对齐可能是一个问题。这也符合我的观察,改变不相关的代码可能会使分段错误出现并消失。但是,在来自GTSAM的此示例代码中,特殊的gtsam::make_shared函数并不用于PreintegratedCombinedMeasurements。这个例子是否不正确,只是偶然地运行?还是这里没有必要使用gtsam::make_shared函数,而对齐实际上不是问题所在?是否有更多关于何时以及如何使用特殊gtsam::make_shared函数的文档?
如果这很重要:我是在ROS节点的上下文中这样做的,所以我使用catkin作为我的构建系统。但是,在没有引用ROS或在代码中使用任何ROS库的情况下,就会出现此问题。
Update:如果我完全放弃共享指针,而只创建类型为PreintegratedCombinedMeasurements的preint,问题仍然存在。
发布于 2020-09-02 15:54:51
经过更多的测试后,我发现这个问题在我放弃Catkin并且只做了一个基本的CMake测试项目时并不存在,所以这个问题必须与Catkin或者我的Catkin配置有关。
Catkin的默认CMakeLists包括针对每个目标的以下行:
add_dependencies(${PROJECT_NAME}_lib ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})我删除了这一行,也从target_link_libraries(...)中删除了target_link_libraries(...)。这解决了问题。
我不知道这为什么解决了这个问题,所以我不会把这个答案标记为接受,除非有人能给出解释。
https://stackoverflow.com/questions/63619467
复制相似问题