未能获得磁偏角

Failure to get magnetic declination

提问人:Omickey 提问时间:7/12/2021 最后编辑:rezsharOmickey 更新时间:7/13/2021 访问量:361

问:

我正在尝试运行一个代码,以便在 GeographicLib 库正在访问的世界磁模型的数据的帮助下获取磁偏角的值。 但是,由于多个错误,编译失败。"undefined reference to"

背景:

  1. 地理库已提取到默认位置/usr/local
  2. 用于运行代码的 IDE 是 Geany
  3. 在 Raspberry Pi 4 上运行,Raspbian 启动
  4. 尝试通过 bash 终端运行的命令 =
(a) g++ work_cpp.cpp -o p 
(b) g++ work_cpp.cpp wmm.h -o p
  1. 尝试通过 IDE 本身构建 =
 g++ -Wall -o "work_cpp" "work_cpp.cpp" (in directory: /home/pi/Desktop/picodes)

我尝试了一些方法,但到目前为止它们都不起作用:

  1. sudo 将 sbin 和 geographicLib 的文件从/usr/local/usr/bin

  2. sudo 将头文件复制到库的位置,即/usr/include

/usr/local/include/GeographicLib 

作为一个新手,我被这些未定义的错误所淹没,我迫切希望得到答案和运行我的代码。


代码如下:

work_cpp.cpp

#include<iostream>
#include "wmm.h"

int main(){
    std::cout<<"starting...\n\r"<<std::endl;
    wmm * magnetic_model = new wmm();
    std::cout<<"\033[2J\033[?25l"<<std::endl;
    while(1){
        magnetic_model->update(19.07283,72.88261,10);
        std::cout<<"\033[0;0H"<<std::endl;
        std::cout<<"Declination: %2.3f\n\r"<<magnetic_model->declination()<<std::endl;
        }
        delete magnetic_model;
    return 0;}

wmm.h

#ifndef __WMM_H__
#define __WMM_H__
#include <GeographicLib/MagneticModel.hpp>
using namespace GeographicLib;
class wmm
{
private:
    double magnetic_declination;
    double magnetic_inclination;
    double field_strength;

public:
    double declination();
    double inclination();
    double strength();
    void update(float lat, float lon, float alt);
};
#endif
void wmm::update(float lat, float lon, float alt)
{
    double Bx, By, Bz, H;
    time_t t = time(NULL);
    tm* timePtr = localtime(&t);
    MagneticModel mag("emm2015");
    mag(timePtr->tm_year + 1900, lat, lon, alt, Bx, By, Bz);
    MagneticModel::FieldComponents(Bx, By, Bz, H, field_strength, magnetic_declination, magnetic_inclination);
}

错误信息:

g++ -Wall -o "work_cpp" "work_cpp.cpp" (in directory: /home/pi/Desktop/picodes)
/usr/bin/ld: /tmp/ccEL2G3m.o: in function `wmm::update(float, float, float)':
work_cpp.cpp:(.text+0x7c): undefined reference to `GeographicLib::Geocentric::WGS84()'
/usr/bin/ld: work_cpp.cpp:(.text+0xa4): undefined reference to `GeographicLib::MagneticModel::MagneticModel(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, GeographicLib::Geocentric const&, int, int)'
/usr/bin/ld: /tmp/ccEL2G3m.o: in function `main':
work_cpp.cpp:(.text+0x288): undefined reference to `wmm::declination()'
/usr/bin/ld: /tmp/ccEL2G3m.o: in function `GeographicLib::MagneticModel::operator()(double, double, double, double, double&, double&, double&) const':
work_cpp.cpp:(.text._ZNK13GeographicLib13MagneticModelclEddddRdS1_S1_[_ZNK13GeographicLib13MagneticModelclEddddRdS1_S1_]+0x6c): undefined reference to `GeographicLib::MagneticModel::Field(double, double, double, double, bool, double&, double&, double&, double&, double&, double&) const'
/usr/bin/ld: /tmp/ccEL2G3m.o: in function `GeographicLib::MagneticModel::FieldComponents(double, double, double, double&, double&, double&, double&)':
work_cpp.cpp:(.text._ZN13GeographicLib13MagneticModel15FieldComponentsEdddRdS1_S1_S1_[_ZN13GeographicLib13MagneticModel15FieldComponentsEdddRdS1_S1_S1_]+0x70): undefined reference to `GeographicLib::MagneticModel::FieldComponents(double, double, double, double, double, double, double&, double&, double&, double&, double&, double&, double&, double&)'
collect2: error: ld returned 1 exit status
Compilation failed.
C++ Linux 链接器错误

评论

0赞 Quimby 7/12/2021
不熟悉那个库,但意味着链接器没有找到函数,你确定你没有忘记链接库吗?我在发布的构建命令中没有看到任何链接。undefined reference
0赞 Botje 7/12/2021
当你说“地理图书馆”时,你能具体说明是哪一个吗?您需要与包含库实际代码的 .so 或 .a 文件链接
0赞 stark 7/12/2021
wmm.h 是编译所需的头文件。要链接您的程序,您需要添加相应的库,该库的名称类似于 libwmm.so。例如-L /usr/local/lib -l wmm

答:

1赞 Botje 7/12/2021 #1

假设您实际上指的是一个名为“GeographicLib”的库,您忘记了与该库的链接

将编译命令更改为:

g++ -Wall -o "work_cpp" "work_cpp.cpp" -L/usr/local/lib -lGeographic

这将告诉编译器在正常路径和 /usr/local/lib 中查找 libGeographic.so(如果要静态链接,则查找 libGeographic.a)。

关于 和 的错误:您需要自己定义这些方法。我不知道你的用例,但它可以像直接在你的类定义中定义(在你的头文件中)一样简单:wmm::declination()wmm::inclination()

double declination() { return magnetic_declination; }

更复杂的定义应该放在你的 .cpp 文件中:

double wmm::declination() { return magnetic_declination; }

评论

0赞 Omickey 7/12/2021
好吧,事实证明我没有正确链接库,这在评论中得到了很好的指出。我按照建议运行了具有正确链接的命令。这确实帮助我减少了大量的错误,除了一个。最后的错误消息: g++ -Wall -o “work_cpp” “work_cpp.cpp” -L/usr/local/lib -lGeographic /usr/bin/ld: /tmp/cc5ZABH1.o: in function wmm::d eclination()' collect2: error: ld returned 1 exit statusmain': work_cpp.cpp:(.text+0x288): undefined reference to
0赞 Botje 7/12/2021
我为此修改了我的答案:你需要定义那个功能。
0赞 Omickey 7/12/2021
哦,好吧,知道了,马上就会调查一下......谢谢!
0赞 Omickey 7/12/2021
可爱的它确实编译成功了