提问人:Omickey 提问时间:7/12/2021 最后编辑:rezsharOmickey 更新时间:7/13/2021 访问量:361
未能获得磁偏角
Failure to get magnetic declination
问:
我正在尝试运行一个代码,以便在 GeographicLib 库正在访问的世界磁模型的数据的帮助下获取磁偏角的值。
但是,由于多个错误,编译失败。"undefined reference to"
背景:
- 地理库已提取到默认位置
/usr/local
- 用于运行代码的 IDE 是 Geany
- 在 Raspberry Pi 4 上运行,Raspbian 启动
- 尝试通过 bash 终端运行的命令 =
(a) g++ work_cpp.cpp -o p
(b) g++ work_cpp.cpp wmm.h -o p
- 尝试通过 IDE 本身构建 =
g++ -Wall -o "work_cpp" "work_cpp.cpp" (in directory: /home/pi/Desktop/picodes)
我尝试了一些方法,但到目前为止它们都不起作用:
sudo 将 sbin 和 geographicLib 的文件从
/usr/local
/usr/bin
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.
答:
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
可爱的它确实编译成功了
评论
undefined reference
-L /usr/local/lib -l wmm