1

編集:GRIBファイルを使用する場合は、Open SourceGeospatialFoundationがサポートするGDALライブラリをお勧めします。あなたはあなた自身に多くの頭痛を救うでしょう:)

UbuntuでQtクリエーターを使用してC++アプリを作成しています。ヘッダーgrib2.hを持つ外部ライブラリlibgrib2c.aを使用しようとしています。すべてがコンパイルされますが、リンクしようとするとエラーが発生します。

'seekgb(_IO_FILE *、long、long、long *、long *)への未定義の参照

ヘッダーファイルを次のようにラップしてみました:

extern "C"{
#include "grib2.h"
}

しかし、それは何も修正されなかったので、それは私の問題ではないと思いました。.proファイルには次の行があります。

include($${ROOT}/Shared/common/commonLibs.pri)

そしてcommonLibs.priで私は持っています:

INCLUDEPATH+=$${ROOT}/external_libs/g2clib/include
LIBS+=-L$${ROOT}/external_libs/g2clib/lib
LIBS+=-lgrib2c

ライブラリの検索でエラーが発生していません。libgrib2c.aでnmコマンドを実行すると、次のようになります。

nm libgrib2c.a | grep seekgb
seekgb.o:
00000000 T seekgb

そして、LIBS + =-Wl、--verboseの追加引数を指定してqmakeを実行すると、出力にlibファイルが見つかります。

attempt to open /usr/lib/libgrib2c.so failed
attempt to open /usr/lib/libgrib2c.a failed
attempt to open /mnt/sdb1/ESMF/App/ESMF_App/../external_libs/linux/qwt_6.0.2/lib/libgrib2c.so failed
attempt to open /mnt/sdb1/ESMF/App/ESMF_App/../external_libs/linux/qwt_6.0.2/lib/libgrib2c.a failed
attempt to open ..//Shared/Config/lib/libgrib2c.so failed
attempt to open ..//Shared/Config/lib/libgrib2c.a failed
attempt to open ..//external_libs/libssh2/lib/libgrib2c.so failed
attempt to open ..//external_libs/libssh2/lib/libgrib2c.a failed
attempt to open ..//external_libs/openssl/lib/libgrib2c.so failed
attempt to open ..//external_libs/openssl/lib/libgrib2c.a failed
attempt to open ..//external_libs/g2clib/lib/libgrib2c.so failed
attempt to open ..//external_libs/g2clib/lib/libgrib2c.a succeeded

ライブラリ内の.oファイルは表示されませんが、これは私のc ++アプリのacライブラリであるためですか?

私が持っているライブラリを使用しようとしている.cppファイル内:

#include "gribreader.h"
#include <stdio.h>
#include <stdlib.h>
#include <external_libs/g2clib/include/grib2.h>
#include <Shared/logging/Logger.hpp>

//------------------------------------------------------------------------------
/// Opens a GRIB file from disk.
///
/// This function opens the grib file and searches through it for how many GRIB
/// messages are contained as well as their starting locations.
///
/// \param a_filePath. The path to the file to be opened.
/// \return True if successful, false if not.
//------------------------------------------------------------------------------
bool GRIBReader::OpenGRIB(std::string a_filePath)
{
  LOG(notification)<<"Attempting to open grib file: "<< a_filePath;
  if(isOpen())
  {
    CloseGRIB();
  }
  m_filePath = a_filePath;
  m_filePtr = fopen(a_filePath.c_str(), "r");

  if(m_filePtr == NULL)
  {
    LOG(error)<<"Unable to open file: " << a_filePath;
    return false;
  }
  LOG(notification)<<"Successfully opened GRIB file";

  g2int currentMessageSize(1);
  g2int seekPosition(0);
  g2int lengthToBeginningOfGrib(0);
  g2int seekLength(32000);
  int i(0);
  int iterationLimit(300);
  m_GRIBMessageLocations.clear();
  m_GRIBMessageSizes.clear();
  while(i < iterationLimit)
  {
    seekgb(m_filePtr, seekPosition, seekLength,
           &lengthToBeginningOfGrib, &currentMessageSize);
    if(currentMessageSize != 0)
    {
      LOG(verbose) << "Adding GRIB message location " << lengthToBeginningOfGrib
                   << " with length " << currentMessageSize;
      m_GRIBMessageLocations.push_back(lengthToBeginningOfGrib);
      m_GRIBMessageSizes.push_back(currentMessageSize);

      seekPosition = lengthToBeginningOfGrib + currentMessageSize;
      LOG(verbose) << "GRIB seek position moved to " << seekPosition;
    }
    else
    {
      LOG(notification)<<"End of GRIB file found, after "<< i
                      << " GRIB messages.";
      break;
    }
  }
  if(i >= iterationLimit)
  {
    LOG(warning) << "The iteration limit of " << iterationLimit
                 << "was reached while searching for GRIB messages";
  }
  return true;
}

また、ヘッダーgrib2.hは次のとおりです。

#ifndef _grib2_H
#define _grib2_H
#include<stdio.h>

#define G2_VERSION "g2clib-1.4.0"
#ifdef __64BIT__
typedef int g2int;
typedef unsigned int g2intu;
#else
typedef long g2int;
typedef unsigned long g2intu;
#endif
typedef float g2float;

struct gtemplate {
   g2int type;           /* 3=Grid Defintion Template.                       */
                         /* 4=Product Defintion Template.                    */
                         /* 5=Data Representation Template.                  */
   g2int num;            /* template number.                                 */
   g2int maplen;         /* number of entries in the static part             */
                         /*                    of the template.              */
   g2int *map;           /* num of octets of each entry in the               */
                         /*         static part of the template.             */
   g2int needext;        /* indicates whether or not the template needs      */
                         /*     to be extended.                              */
   g2int extlen;         /* number of entries in the template extension.     */
   g2int *ext;           /* num of octets of each entry in the extension     */
                         /*                      part of the template.       */
};

typedef struct gtemplate gtemplate;

struct gribfield {
   g2int   version,discipline;
   g2int   *idsect;
   g2int   idsectlen;
   unsigned char *local;
   g2int   locallen;
   g2int   ifldnum;
   g2int   griddef,ngrdpts;
   g2int   numoct_opt,interp_opt,num_opt;
   g2int   *list_opt;
   g2int   igdtnum,igdtlen;
   g2int   *igdtmpl;
   g2int   ipdtnum,ipdtlen;
   g2int   *ipdtmpl;
   g2int   num_coord;
   g2float *coord_list;
   g2int   ndpts,idrtnum,idrtlen;
   g2int   *idrtmpl;
   g2int   unpacked;
   g2int   expanded;
   g2int   ibmap;
   g2int   *bmap;
   g2float *fld;
};

typedef struct gribfield gribfield;


/*  Prototypes for unpacking API  */
void seekgb(FILE *,g2int ,g2int ,g2int *,g2int *);
g2int g2_info(unsigned char *,g2int *,g2int *,g2int *,g2int *);
g2int g2_getfld(unsigned char *,g2int ,g2int ,g2int ,gribfield **);
void g2_free(gribfield *);

/*  Prototypes for packing API  */
g2int g2_create(unsigned char *,g2int *,g2int *);
g2int g2_addlocal(unsigned char *,unsigned char *,g2int );
g2int g2_addgrid(unsigned char *,g2int *,g2int *,g2int *,g2int ); 
g2int g2_addfield(unsigned char *,g2int ,g2int *,
                       g2float *,g2int ,g2int ,g2int *,
                       g2float *,g2int ,g2int ,g2int *);
g2int g2_gribend(unsigned char *);

/*  Prototypes for supporting routines  */
extern double int_power(double, g2int );
extern void mkieee(g2float *,g2int *,g2int);
void rdieee(g2int *,g2float *,g2int );
extern gtemplate *getpdstemplate(g2int);
extern gtemplate *extpdstemplate(g2int,g2int *);
extern gtemplate *getdrstemplate(g2int);
extern gtemplate *extdrstemplate(g2int,g2int *);
extern gtemplate *getgridtemplate(g2int);
extern gtemplate *extgridtemplate(g2int,g2int *);
extern void simpack(g2float *,g2int,g2int *,unsigned char *,g2int *);
extern void compack(g2float *,g2int,g2int,g2int *,unsigned char *,g2int *);
void misspack(g2float *,g2int ,g2int ,g2int *, unsigned char *, g2int *);
void gbit(unsigned char *,g2int *,g2int ,g2int );
void sbit(unsigned char *,g2int *,g2int ,g2int );
void gbits(unsigned char *,g2int *,g2int ,g2int ,g2int ,g2int );
void sbits(unsigned char *,g2int *,g2int ,g2int ,g2int ,g2int );

int pack_gp(g2int *, g2int *, g2int *,
            g2int *, g2int *, g2int *, g2int *, g2int *,
            g2int *, g2int *, g2int *, g2int *,
            g2int *, g2int *, g2int *, g2int *, g2int *,
            g2int *, g2int *, g2int *);

#endif  /*  _grib2_H  */

私はこれについて2日間頭を悩ませてきました。誰かが何をすべきかについての考えを持っているか、ある種の方向に私を向けることができるなら、私は困惑しています。また、私がこの投稿をどのように改善できるかについてコメントがあれば、私はそれらを聞いてみたいです、この投稿のことでちょっと新しいです。通常、私はすでにWebに含まれている膨大な知識の蓄積から答えを見つけることができます。

4

1 に答える 1

1

ヘッダーファイルの先頭近くに次のように配置して、外部Cリンケージを明示的に指定してみてください。

#ifdef __cplusplus
extern "C" {
#endif

そしてこれは底の近くにあります:

#ifdef __cplusplus
}
#endif
于 2012-08-01T21:25:03.043 に答える