无法链接CCfits示例程序

时间:2015-09-28 13:06:03

标签: c++ linker-errors fits

这可能与

有关

c++ reading fits file using ccfits

从未回答。

无论如何,我希望我的问题更容易重现。 CCfits有一个示例程序:

http://heasarc.gsfc.nasa.gov/fitsio/CCfits/html/cookbook.html

我试图使用以下方法编译它:

g++ cookbook.cpp -o cookbook -lCCfits -lcfitsio

文件中的每个CCfits函数的链接都失败:

  

/tmp/cc7hVaju.o:在函数main': cookbook.cpp:(.text+0x14): undefined reference to中写入writeImage()'   cookbook.cpp :(。text + 0x31):未定义引用writeAscii()' cookbook.cpp:(.text+0x4e): undefined reference to writeBinary()'   cookbook.cpp :(。text + 0x6b):未定义引用copyHDU()' cookbook.cpp:(.text+0x88): undefined reference to readHeader()'   cookbook.cpp :(。text + 0xa5):未定义引用readImage()' cookbook.cpp:(.text+0xc2): undefined reference to readTable()'   cookbook.cpp :(。text + 0xdf):未定义引用readExtendedSyntax()' cookbook.cpp:(.text+0xfc): undefined reference to selectRows()'   collect2:错误:ld返回1退出状态

我已经尝试使用Ubuntu附带的CCfits包。我自己也试过安装包。同样的错误。

奇怪的是,如果我不在命令行中包含库(即“g ++ cookbook.cpp -o cookbook”),我会得到类似的消息。一个区别是我也得到了这个错误:

  

/tmp/ccMVMkSB.o:在函数CCfits::FITS::setVerboseMode(bool)': cookbook.cpp:(.text._ZN6CCfits4FITS14setVerboseModeEb[_ZN6CCfits4FITS14setVerboseModeEb]+0xf): undefined reference to CCfits :: FITS :: s_verboseMode'

这一定是个线索,对吧?似乎说我命名的库虽然存在但并不包含我需要的所有功能。

感谢您的帮助,

查尔斯

1 个答案:

答案 0 :(得分:0)

不知道您是否对此问题有一个合适的答案,但是据我所知,主要问题是您没有在函数签名中包含定义。这些通常在c ++库的头文件中定义。

例如,如果您的库安装在UNIX系统上的“ / usr / local ”中,则头文件将安装在“ / usr / local / include /”位置CCfits ”。相应的lib文件将安装在“ / usr / local / lib ”中。重要的是,编译器不知道这一点,您需要将这些位置告知它。

g++ cookbook.cpp -o cookbook -I /usr/local/include/CCfits -L /usr/local/lib -lCCfits -lcfitsio

-I / usr / local / include / CCfits ”标志和给定的参数会通知g ++要查找的头文件的位置。 “ -L / usr / local / lib ”标志和给定的参数将库文件的位置通知g ++。重要的是要注意,g ++会在标准位置中搜索环境中的库,这只是为其提供了更多搜索位置。实际上,如果在不同位置找到多个相同的库,应该怎么做,但我没有明确记住。

为了安全起见,请确保操作系统已将库加载到内存中。这些共享库不是静态的,因此不会存储到可执行文件中。这在编译源代码时不会有什么不同,但是会阻止可执行文件的成功执行。为确保操作系统已将库加载到内存中,请运行以下命令:

sudo ldconfig

您好,

奥马尔情商