即使链接器找到目标文件,为什么我的程序看不到函数定义?
问题描述:
我有一个库(giftiio),其头文件位于/usr/include/gifti
,libgiftiio.a
位于/usr/lib
。即使链接器找到目标文件,为什么我的程序看不到函数定义?
我尝试用一个简单的程序中使用它,read_hemi.cc
:
#include <gifti_io.h>
int main(const int argc, const char *argv[]) {
gifti_image *out_im;
gifti_disp_lib_version();
}
然后我尝试编译此程序:
,并出现以下错误:
/tmp/ccqWBaLb.o: In function `main':
read_hemi.cc:(.text+0x10): undefined reference to `gifti_disp_lib_version()'
请注意,头文件中定义的所有内容都是可访问的(例如gifti_image类型DEF)。但即使链接器没有在我的-lgiftiio
标志处抱怨,提示它找到目标文件,但我没有得到我的函数定义。
答
get the following error
你的链接命令行是错误的,应该是:
g++ -I/usr/include/gifti -I/usr/include/nifti read_hemi.cc -lgiftiio
更新:
changing the order does not help
从错误消息,我们看到,未解析的符号是一个C++错位之一。
正在搜索gifti_disp_lib_version,我觉得这个版本的gifti_io.h。看起来这是一个纯粹的库,并且标题缺少正确的守卫。
要解决此问题,你必须改变你的程序就像这样:
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 -lgiftiio' 这将返回相同的错误 –
@CarsonMcNeil我已更新答案。 –