这可能与
有关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'
这一定是个线索,对吧?似乎说我命名的库虽然存在但并不包含我需要的所有功能。
感谢您的帮助,
查尔斯
答案 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
您好,
奥马尔情商