【问题标题】:Why can't my program see function definitions even though the linker finds the object file? [duplicate]为什么即使链接器找到目标文件,我的程序也看不到函数定义? [复制]
【发布时间】:2017-08-07 00:01:37
【问题描述】:

我有一个库 (giftiio),其中包含 /usr/include/gifti 中的头文件和 /usr/lib 中的 libgiftiio.a

我尝试用一​​个简单的程序来使用它,read_hemi.cc:

#include <gifti_io.h>

int main(const int argc, const char *argv[]) {
  gifti_image *out_im;
  gifti_disp_lib_version();
}

然后我尝试编译这个程序:

g++ -lgiftiio -I/usr/include/gifti -I/usr/include/nifti read_hemi.cc

并得到以下错误:

/tmp/ccqWBaLb.o: In function `main': 
read_hemi.cc:(.text+0x10): undefined reference to `gifti_disp_lib_version()'

请注意,头文件中定义的所有内容都是可访问的(例如gifti_image typedef)。但即使链接器没有在我的-lgiftiio 标志处抱怨,暗示它找到了目标文件,我也没有得到我的函数定义。

【问题讨论】:

    标签: c++ linker g++


    【解决方案1】:

    得到以下错误

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

    g++ -I/usr/include/gifti -I/usr/include/nifti read_hemi.cc -lgiftiio
    

    要了解原因,请阅读 thisthis

    更新:

    更改顺序无济于事

    从错误消息中,我们看到未解析的符号是 C++ 损坏的符号。

    搜索gifti_disp_lib_version,我找到了gifti_io.h这个版本。看来这是一个纯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 -lgiftiio 这会返回同样的错误
    • @CarsonMcNeil 我已经更新了答案。
    • 非常感谢!那成功了。有趣的是,我的印象是 C++ 与 C 完全兼容......我必须阅读这个。
    猜你喜欢
    • 2013-08-05
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多