0

这可能与

c++ 使用 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 towriteImage()'cookbook.cpp:(.text+0x31): undefined reference to writeAscii()' cookbook.cpp:(.text+0x4e): undefined reference towriteBinary()' cookbook.cpp:(.text+0x6b): undefined reference to copyHDU()' cookbook.cpp:(.text+0x88): undefined reference toreadHeader()' cookbook .cpp:(.text+0xa5): 未定义对readImage()' cookbook.cpp:(.text+0xc2): undefined reference toreadTable()' 的引用 cookbook.cpp:(.text+0xdf): 未定义对readExtendedSyntax()' cookbook.cpp:(.text+0xfc): undefined reference toselectRows()'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 toCCfits::FITS::s_verboseMode'

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

谢谢你的帮助,

查尔斯

4

1 回答 1

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

你的 是的,

奥马尔情商

于 2020-09-16T00:41:48.057 回答