【问题标题】:Cannot Call C++ Code from C without Error [duplicate]无法从 C 调用 C++ 代码而没有错误 [重复]
【发布时间】:2019-02-19 00:06:41
【问题描述】:

我正在尝试编写一个可以从 C 调用的 C++ 库。但是,每当我尝试编写一个最简单的示例时,它都会因未定义的引用而崩溃。这是我的代码:


mylibrary.h

#ifndef __MY_CPP_THING_H
#define __MY_CPP_THING_H

#ifdef __cplusplus
extern "C" {
#endif

void printSomething();

#ifdef __cplusplus
}
#endif

#endif

mylibrary.cpp

#include <iostream>

#include "mylibrary.h"

extern "C" {

void printSomething() {
    std::cout << "PLEASE PRINT\n";
}

}

ma​​in.c

#include "mylibrary.h"

int main() {
    printSomething();
    return 0;
}

编译过程是这样的:

g++ -c mylibrary.cpp -o mylibrary.o(创建“mylibrary.o”)

ar rcs libmylibrary.a mylibrary.o(创建静态库“libmylibrary.a”)

gcc main.c -L. -lmylibrary(链接静态库并编译C源文件)

但是,我收到了这个错误转储:

mylibrary.o:mylibrary.cpp:(.text+0x17): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
mylibrary.o:mylibrary.cpp:(.text+0x32): undefined reference to `std::ios_base::Init::~Init()'
mylibrary.o:mylibrary.cpp:(.text+0x62): undefined reference to `std::ios_base::Init::Init()'
mylibrary.o:mylibrary.cpp:(.rdata$.refptr._ZSt4cout[.refptr._ZSt4cout]+0x0): undefined reference to `std::cout'
collect2.exe: error: ld returned 1 exit status

关于如何解决错误的任何建议?

【问题讨论】:

  • 前端程序gcc 没有与C++ 标准库链接。您要么必须自己做,要么在链接时也使用g++。是的,g++ 也可以用来编译和构建 C 源文件,就像 gcc 可以编译 C++ 源文件一样。我知道这有重复。
  • 基本上不要从 C 中调用 C++。例如,C++ 库函数会使用异常,而 C 调用代码无法处理它们。
  • @Someprogrammerdude 不幸的是,由于我的情况,gcc 是我唯一的选择。我将如何链接标准库?
  • @pmg 有很多不错的方法可以解决这个问题。 OP 没有做任何事情,但这是无关紧要的。
  • @Griffort 你的 cpp 库必须是静态库吗?

标签: c++ c extern-c


【解决方案1】:

mylibrary.o 仍然依赖于 C++ 标准库,gcc 对此一无所知。在最后一步用-lstdc++ 调用gcc

【讨论】:

  • 另一种选择是使用 g++ 作为链接器步骤
【解决方案2】:

创建一个动态库而不是静态库应该可以解决问题:

$ gcc -c main.c
$ g++ -fPIC -shared -o mylibrary.so mylibrary.cpp
$ gcc -o main main.o mylibrary.so

然后:

$ LD_LIBRARY_PATH=".:${LD_LIBRARY_PATH}" ./main
PLEASE PRINT

与:

$ objdump -p main | grep NEEDED
  NEEDED               mylibrary.so
  NEEDED               libc.so.6
$ objdump -p mylibrary.so | grep NEEDED
  NEEDED               libstdc++.so.6
  NEEDED               libc.so.6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多