【问题标题】:C++ static library linking in a C project [duplicate]C项目中的C++静态库链接[重复]
【发布时间】:2019-03-13 18:35:00
【问题描述】:

我正在尝试将 C++ 库静态链接到 C 项目,但似乎无法找到出路。我阅读了多个帖子,但没有任何帮助。 下面是我的 Makefile 的 sn-p:

 CFLAGS += -I../path/to/headers
 LIBS += ../path/to/lib.a

我收到以下链接错误:

"undefined reference to ...
collect2: ld returned 1 exit status"

我查看了这篇文章的订购信息,但我认为这不是问题: c++ undefined references with static library

我想知道这是否可能。如果是这样,我需要将哪些标志添加到我的 C 项目 Makefile 中。

【问题讨论】:

  • 您不能将 c++ 直接链接到 c,因为名称会在名称修饰下。你可以使用extern "C"(或者猜错名字:P)
  • 除了@appleapple 猜错名字并没有那么复杂。编译代码后,您可以查看对象或库文件(例如,在 Linux 上使用 nm)。糟糕的是,名称修饰不是标准化的,并且取决于编译器/平台。我支持 appleapple 为他/她提供关于 extern "C" 的更好建议。虽然,它有局限性,并且标记的变量和函数确实必须符合 C。(恕我直言,对于后一个事实,没有出路。)
  • 而且,它是否适用于静态和动态(使用 SO 文件而不是静态)链接?
  • 您能说明哪些引用未解决吗?他们应该来自那个 C++ 库吗?
  • 这些引用来自我正在尝试集成的 C++ 库。在上面的例子中,它只是一个函数调用。例如。对“call_add”的未定义引用,其中 call_add 是在某个 C++ 文件中的头文件和实现中声明的函数。

标签: c++ c makefile


【解决方案1】:

如果您假装链接的库不准备在目标代码中导出与 C 兼容的函数名称,您应该在您的项目中添加一个 C++/C 桥。

此桥可能包含 C++ 头文件和源文件,您可以在其中编写使用 C++ 库的 C++ 代码,您需要从 C 程序中使用的符号以 C 兼容方式导出。

你应该这样做:

bridge.h

#include <cpplibrary.h>
#ifdef __cplusplus
extern "C" {
#endif

int bridge();

#ifdef __cplusplus
}
#endif

bridge.cpp

#include "bridge.h"

extern "C" {
int bridge() {
CppLibrary *object = new CppLibrary();
return object->returnInt();
}

} // extern "C"

此 C++ 代码编译后导出 C 链接器可以理解的名称,允许间接使用该给定库的 C++ 代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    相关资源
    最近更新 更多