【问题标题】:Linking C and C++ object files [duplicate]链接 C 和 C++ 目标文件 [重复]
【发布时间】:2014-03-21 16:55:58
【问题描述】:

我有以下设置:

main.c:

extern void sol();
int main(){
    sol();
}

sol.cc:

#include<iostream>
using namespace std;
void sol(){
    cout<<"HW!!\n";
}

我编译为单独的目标文件:

$gcc main.c -c
$g++ sol.cc -c

但是当我尝试将它们链接到单个可执行文件时,

$g++ main.o sol.o

我得到:main.c:(.text+0x7): undefined reference to 'sol'nm sol.o 表明存在00000000 T _Z3solv,而nm main.o 需要U sol。我发现 C++ 重命名函数以避免重载函数的名称相同。有没有办法告诉编译器sol.o 包含重命名的函数,或者编译sol.cc 而不重命名它们?

【问题讨论】:

  • 我认为 extern "C" 会阻止重命名发生。 IE。 extern "C" void sol(){cout
  • 最好在混合 C 和 C++ 程序中将 main() 函数设为 C++ 函数,即使它由整个 int main(int argc, char **argv) { return c_main(argc, argv); } 组成(声明等同于 extern "C" int c_main(int argc, char **argv);在适用范围)。原来的 C main() 被简单地重命名为 c_main() — 或 real_main() 或任何其他你喜欢的名称。
  • 非常感谢,它有效!

标签: c++ c linker ld object-files


【解决方案1】:
extern "C" void sol()
{
    cout<<"HW!!\n";
}

【讨论】:

    【解决方案2】:

    您必须使用extern "C" 声明才能使sol 对C 可用。将其放入公共标头中:

    extern "C" void sol();
    

    【讨论】:

    • 如果你想要一个通用的头文件,你需要使用#ifdef __cplusplus,因为extern "C"在C语言中是无效的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2011-01-01
    • 2013-04-25
    • 1970-01-01
    • 2013-04-19
    • 2012-12-19
    相关资源
    最近更新 更多