C++ 为什么即使链接器找到了对象文件,我的程序也看不到函数定义?

C++ 为什么即使链接器找到了对象文件,我的程序也看不到函数定义?,c++,linker,g++,C++,Linker,G++,我有一个库giftio,头文件在/usr/include/gifti中,libgiftio.a在/usr/lib中 我试着用一个简单的程序来使用它,阅读_hemi.cc: 并获取以下错误: /tmp/ccqWBaLb.o: In function `main': read_hemi.cc:(.text+0x10): undefined reference to `gifti_disp_lib_version()' 请注意,头文件中定义的所有内容都可以访问,例如gifti_image type

我有一个库giftio,头文件在/usr/include/gifti中,libgiftio.a在/usr/lib中

我试着用一个简单的程序来使用它,阅读_hemi.cc:

并获取以下错误:

/tmp/ccqWBaLb.o: In function `main': 
read_hemi.cc:(.text+0x10): undefined reference to `gifti_disp_lib_version()'
请注意,头文件中定义的所有内容都可以访问,例如gifti_image typedef。但是,即使链接器没有抱怨my-lgiftiio标志,暗示它找到了对象文件,我也没有得到我的函数定义

获取以下错误

您的链接命令行错误,应该是:

g++ -I/usr/include/gifti -I/usr/include/nifti read_hemi.cc -lgiftiio
要了解原因,请阅读或阅读

更新:

改变顺序没有帮助

从错误消息中,我们看到未解析的符号是C++的一个符号。 在搜索gifti_disp_lib_版本时,我找到了的这个版本。这是一个PURE C库,并且头缺少适当的C++守护程序。 要解决此问题,您必须更改程序,如下所示:

extern "C" {
#include <gifti_io.h>
}

int main(const int argc, const char *argv[]) {
  // rest as before ...

谢谢你的链接,我想我明白了。但是,更改顺序没有帮助。如果我复制并粘贴您的命令,我会得到完全相同的错误。为了更安全,我可以将命令一分为二,然后首先编译:g++-c-I/usr/include/gifti-I/usr/include/nifti read_hemi.cc,然后是g++read_hemi.o-lgiftio这将返回相同的错误error@CarsonMcNeil我已经更新了答案。非常感谢!这就成功了。有趣的是,我的印象是C++完全兼容C……我得读一读。
g++ -I/usr/include/gifti -I/usr/include/nifti read_hemi.cc -lgiftiio
extern "C" {
#include <gifti_io.h>
}

int main(const int argc, const char *argv[]) {
  // rest as before ...