【问题标题】:Linking C++ to C in GCC在 GCC 中将 C++ 链接到 C
【发布时间】:2011-11-09 10:41:08
【问题描述】:

我在 C++“静态库”项目中有一个函数 extern "C" int ping(void)。现在,我想编写一个简单的 Hello-World C 程序,它会调用这个函数 int x = ping();

我使用g++ / gcc,但我无法将C 可执行文件与C++ 共享库链接。请问,怎么可能做到这一点?您能否提供准确的gcc 命令?

编辑

g++ -c -static liba.cpp
ar rcs liba.a liba.o
gcc -o x main.o -L. -la

然后得到:

./liba.a(liba.o):(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'

collect2: ld 返回 1 个退出状态

【问题讨论】:

  • 静态库文件的名称是什么?它的形式是“lib.a”吗?如果是,您应该能够使用编译器标志“-L -l
  • 我得到:./liba.a(liba.o):(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status

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


【解决方案1】:

您可能必须使用 g++ 作为链接器,而不是 gcc。如果ping() 函数使用任何 STL,或异常、new 等,它可能会链接到 libstdc++,当您使用 g++ 作为链接器时,它会自动链接。

【讨论】:

  • 好点。但是 ping() 只是返回数字 1,仍然需要用 g++ 编译主项目。好吗?
  • 鉴于您在上面粘贴的错误,您确实需要使用 g++ 进行链接。您可以使用 gcc 编译一些文件,但需要将 g++ 用作链接器(或者将 -lstdc++ 显式添加到您的 LDFLAGS/链接器命令行)。
  • 一个问题:如果我需要从C(用gcc编译)调用一个DLL(用g++编译),那有可能吗? (而不是静态链接)
  • 是的,只要您 a) 自己处理名称修改,或 b) 将符号标记为 extern "C"
【解决方案2】:

查找名称修改。如果 C++ 库不导出“extern C”名称,它会以三种不同的方式之一变得有趣,具体取决于用于构建库的编译器。

即便如此,您也不会得到满意的结果,因为从 C 端开始的程序无法正确处理许多 C++ 概念。当 C 程序不理解这种“外来”语言的保证时,您不会认为 C 程序实际上会执行任何间接调用的 C++ 静态块,是吗?

故事的简短版本。即使你使用 C 编程,如果你想正确处理 C++ 库,你也需要用 C++ 编译你的 main。

【讨论】:

    【解决方案3】:

    我在使用 GCC 编译和链接混合 C/C++ 代码方面取得了不错的效果,但是你们都需要“extern C”(将函数显式声明为 C 函数)并使用 -lstdc++ 链接 C++ 库。

    另见:

    In C++ source, what is the effect of extern "C"?

    What is the difference between g++ and gcc?

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多