C库未使用gcc / g ++进行链接

时间:2009-07-01 09:14:45

标签: c g++ static-linking

我有一个我在gcc中使用的c库。该库具有扩展名.lib,但始终链接为静态库。如果我编写一个使用该库作为c代码的程序,那么一切都可以。但是,如果我将文件重命名为.cpp(在c / c ++中执行简单的操作),我会得到未定义的引用。这些是我为测试目的编写的简单小程序,因此没有花哨的东西。我使用编译:

gcc -g -Wall -I <path to custom headers> -o program main.c customlibrary.lib -lm -lpthread

上面的作品就像一个魅力。但是:

g++ -g -Wall -I <path to custom headers> -o program main.cpp customlibrary.lib -lm -lpthread

gcc -g -Wall -I <path to custom headers> -o program main.cpp customlibrary.lib -lm -lpthread -lstdc++

导致对customlibrary.lib中任何函数的未定义引用。我尝试创建一个名为customlibrary.a的符号链接,但没有运气。

为什么g ++不能识别我的库。不幸的是我无法访问库的源代码,但是将c-lib链接到c ++应该不是问题吧?

3 个答案:

答案 0 :(得分:38)

您的库似乎有一个API,假定它将从C而不是C ++调用。这很重要,因为C ++有效地要求从库中导出的符号中包含的信息多于函数名称。这是通过“名称修改”函数来处理的。

我假设您的库有一个声明其公共接口的包含文件。为了使它与C和C ++兼容,你应该安排告诉C ++编译器它应该假定它声明的函数使用C的链接和命名。

测试这个问题的一个简单方法就是这样做:

extern "C" {
#include "customlibrary.h"
}
在你的main.cpp中

,而不是直接包含customlibrary.h

要使标题本身在两种语言中都正常工作并正确地将其函数声明为C-C到C ++,请将以下内容放在头文件的顶部附近:

#ifdef __cplusplus
extern "C" {
#endif

以及接近底部的以下内容:

#ifdef __cplusplus
}
#endif

答案 1 :(得分:4)

C ++编译器执行所谓的名称修改 - 代码中出现的名称与链接器看到的名称不同。这种方法的正常方法是告诉编译器某些函数需要C链接:

// myfile.cpp
extern "C" int libfun();    // C function in your library

或者为整个头文件执行此操作:

// myfile.cpp
extern "C" {
  #include "mylibdefs.h"      // defs for your C library functions
}

答案 2 :(得分:2)

您的头文件是否具有正常的

#ifdef __cplusplus
extern "C" {
#endif

// ...

#ifdef __cplusplus
} /* extern "C" */
#endif

明确地给库函数C链接。

.cpp文件是使用C ++链接编译的,默认情况下是名称修改。