C ++读取使用CCFITS适合文件

c++ reading fits file using ccfits

本文关键字:文件 CCFITS 读取      更新时间:2023-10-16

所以......谁能看到我在这里做错了什么?!?我正在尝试使用CCfits按照他们在 http://heasarc.gsfc.nasa.gov/fitsio/CCfits/html/readimage.html 上的示例读取C++中的*.fits文件。

#include <iostream>
#include <valarray>
#include <CCfits/CCfits.h>
#include <CCfits/PHDU.h>
namespace fit = CCfits;
int main(int argc, char * argv[]) {
    fit::FITS inFile(
        "../data/example/example.fits",
        fit::Read,
        true
    );
    fit::PHDU & phdu = inFile.pHDU();
    std::valarray<unsigned int> fitsImage;
    phdu.read(fitsImage);
    return 0;
}

我收到以下错误:

undefined reference to `void CCfits::PHDU::read<unsigned int>(std::valarray<unsigned int>&)'
collect2: error: ld returned 1 exit status

我正在链接这个:

g++ test.cpp -o test -L/usr/lib/x86_64-linux-gnu/ -std=c++11 -lCCfits -lcfitsio

虽然我看了/usr/include/CCfits/PHDU.h,但它有这个:

template<typename S>
void read(std::valarray<S>& image);

有没有可能libCCfits没有编译正确?

(这与 CCfit 库演示代码不起作用有点关系,但由于没有人真正扩展它......我一无所有)。这让我发疯,我想我错过了一些非常明显的东西。

谢谢。

如果没有libCCfits.so,这是您使用的 Linux 发行版中的错误。(我在较旧的 Fedora 发行版上遇到了与其他库的等效问题。修复它的最简单方法是添加一个从libCCfits.solibCCfits.so.0libCCfits.so.0.0.0的符号链接,假设后者存在于..../.libs文件夹中。另一种方法是编译自己CCfits-2.4.tar.gz的源包

tar -xzf CCfits-2.4.tar.gz
cd CCfits
./configure --prefix=.... --with-cfitsio-include=..../cfitsio/cfitsio --enable-static LDFLAGS="-L..../cfitsio/cfitsio"

其中的点取决于您的偏好和底层 cfitsio 的位置。

你只需要一件事:

#include <CCfits>

在代码的头部(然后您可以删除其他 CCFits 包含)原因很简单。PHDU::read() 方法的代码不是共享库的一部分,而是"包含"在"包含"文件中(准确地说是 PHDUT.h)...所以它们将被编译到你自己的程序中

安东尼。

标准的configuremakemake install CCfits的循环安装会将库放入代码的/.libs文件夹中。除非您正在使用 libtools,-L compiler/linker 开关需要查看向下查找库:

g++ ...  -Lblabla/CCfits/CCfits/.libs ...