【问题标题】:Trouble linking c++ exe against C library (GNU)将 c++ exe 与 C 库 (GNU) 链接时出现问题
【发布时间】:2013-02-12 20:52:33
【问题描述】:

我创建了一些简单的基本代码来说明我的问题。

header.h:

#ifdef __cplusplus
#   define API extern "C"
#else
#   define API
#endif

void callback();
API void libFunction();

testlib.c:

#include "header.h"

void libFunction()
{
    Callback();
}

我把它编译成这样的静态库:

gcc -c testlib.c
ar rsc libtest.a testlib.o

那么我的示例 c++ 代码是

main.cpp:

extern  "C"{
#include  <lib/header.h>
}
#include  <stdio.h>

main()
{
    libFunction();
}

void Callback()
{
    printf("Callback is called \n");
}

我尝试这样构建我的 exe

g++ -I. -L. main.cpp -ltest

并得到以下错误

./lib/libtest.a(testlib.o): In function `libFunction':
testlib.c:(.text+0x7): undefined reference to `Callback'
collect2: ld returned 1 exit status

我花了一整天的时间试图找出原因。有人可以帮忙吗?

【问题讨论】:

    标签: c++ c gcc linker g++


    【解决方案1】:

    如果您想从 C 文件中调用 Callback,则需要在您的 C++ 文件中构建 extern "C" - 否则 C++ 名称修改将导致符号不对齐。您需要将main.cppCallback()的定义更改为:

    extern "C" void Callback()
    

    您也有大小写不匹配的问题。标题中的原型是callback,但在其他任何地方你都使用Callback。在重新阅读您的代码时,我认为只需修复这种大小写不匹配即可解决您的所有问题。在第一次阅读时,我没有看到 #include &lt;lib/header.h&gt; 周围的 extern "C" 包装器。

    【讨论】:

    • 您好,大小写不匹配是对的,这是我发布的代码的唯一问题。我修复了它,它现在正在编译,即使没有 extern。
    • 现在我只需要找出为什么我更大的“真实”代码没有链接大声笑,感谢您的回复
    • @BrandonYates - 是的,这是有道理的。我没有注意到您在 main.cpp 文件中的 #include 语句周围的 extern "C" 包装器。你应该可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多