C++ 使用动态库qpOASES和CMakeList.txt时,未定义对qpOASES的引用错误

C++ 使用动态库qpOASES和CMakeList.txt时,未定义对qpOASES的引用错误,c++,dynamic-linking,ros2,C++,Dynamic Linking,Ros2,我正在ROS2中构建一个包。当我想在头文件中包含动态库qpOASES时,出现了对的未定义引用错误 Qpoas安装在~下。 我尝试了查找包(需要Qpoas)。但是我弄错了 By not providing "FindqpOASES.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "qpOASES", but CMake did not

我正在ROS2中构建一个包。当我想在头文件中包含动态库qpOASES时,出现了对的未定义引用错误

Qpoas安装在
~
下。 我尝试了
查找包(需要Qpoas)
。但是我弄错了

By not providing "FindqpOASES.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "qpOASES", but CMake did not find one.
在头文件中,我使用
#include
。在CMakeList.txt文件中,我使用
目标链接库(我的节点Eigen3::Eigen~/qpOASES-3.2.1/bin/libqpOASES.so)
。但是当我编译它时,出现了以下错误

ltv_mpc_controller.cpp:(.text+0x4a07): undefined reference to `qpOASES::SQProblem::SQProblem(int, int, qpOASES::HessianType, qpOASES::BooleanType)'
ltv_mpc_controller.cpp:(.text+0x4a7b): undefined reference to `qpOASES::QProblem::init(double const*, double const*, double const*, double const*, double const*, double const*, double const*, int&, double*, double const*, double const*, qpOASES::Bounds const*, qpOASES::Constraints const*, double const*)'
ltv_mpc_controller.cpp:(.text+0x4aeb): undefined reference to `qpOASES::SQProblem::hotstart(double const*, double const*, double const*, double const*, double const*, double const*, double const*, int&, double*, qpOASES::Bounds const*, qpOASES::Constraints const*)'

有人知道如何修复此错误吗?

在Linux makefile
make_Linux.mk
的第110行有

CPPFLAGS = -Wall -pedantic -Wshadow -Wfloat-equal -O3 -Wconversion -Wsign-conversion -fPIC -DLINUX -D__USE_LONG_INTEGERS__ -D__USE_LONG_FINTS__
尝试删除标志
-D\u使用\u长\u整数\u\u-D\u使用\u长\u查找\u


这为我解决了问题。

在Linux makefile
make_Linux.mk
第110行有

CPPFLAGS = -Wall -pedantic -Wshadow -Wfloat-equal -O3 -Wconversion -Wsign-conversion -fPIC -DLINUX -D__USE_LONG_INTEGERS__ -D__USE_LONG_FINTS__
尝试删除标志
-D\u使用\u长\u整数\u\u-D\u使用\u长\u查找\u


这为我修复了它。

或者,你也可以调整你的cmake构建来添加这些定义。核心问题是头文件没有在构建设置中封装这种差异。qpOASES构建通过
CPPFLAGS
传递这些信息,并且定义不会导出到外部可见的任何地方

替代解决方案:

    target_compile_definitions(
        my_node PRIVATE __USE_LONG_INTEGERS__ __USE_LONG_FINTS__
    )

或者,您也可以调整cmake构建以添加这些定义。核心问题是头文件没有在构建设置中封装这种差异。qpOASES构建通过
CPPFLAGS
传递这些信息,并且定义不会导出到外部可见的任何地方

替代解决方案:

    target_compile_definitions(
        my_node PRIVATE __USE_LONG_INTEGERS__ __USE_LONG_FINTS__
    )