将 C 编译的静态库链接到C++程序
Linking C compiled static library to C++ Program
我试图将静态库(用gcc编译(链接到c ++程序,我得到了"未定义的引用"。我在 ubuntu 12.04 服务器机器上使用 gcc 和 g++ 版本 4.6.3。例如,下面是阶乘方法的简单库文件:
mylib.h
#ifndef __MYLIB_H_
#define __MYLIB_H_
int factorial(int n);
#endif
mylib.c
#include "mylib.h"
int factorial(int n)
{
return ((n>=1)?(n*factorial(n-1)):1);
}
我使用 gcc 为这个 mylib.c 创建了对象:
gcc -o mylib.o -c mylib.c
同样,使用 AR 实用程序从对象文件创建了静态库:
ar -cvq libfact.a mylib.o
我用C程序(test.c(和C++程序(test.cpp(测试了这个库
C 和 C++ 程序具有相同的主体:
#include "mylib.h"
int main()
{
int fact = factorial(5);
return 0;
}
假设静态库libfact.a在/home/test目录中可用,我编译了我的C程序没有任何问题:
gcc test.c -L/home/test -lfact
但是C++测试程序时,它抛出了一个链接错误:
g++ test.cpp -L/home/test -lfact
test.cpp:(.text+0x2f): undefined reference to `factorial(int)'
collect2: ld returned 1 exit status
我什至尝试在测试中添加 extern 命令.cpp:
extern int factorial(int n) //added just before the main () function
还是同样的错误。
- 有人可以告诉我我在这里错了什么吗?
- 创建静态库时我错过了什么吗?
- 我是否必须在
test.cpp
中添加任何内容才能使其正常工作?
问题是你还没有告诉你的C++程序阶乘是用 C 编写的。您需要更改 test.h 头文件。喜欢这个
#ifndef __MYLIB_H_
#define __MYLIB_H_
#ifdef __cplusplus
extern "C" {
#endif
int factorial(int n);
#ifdef __cplusplus
}
#endif
#endif
现在,您的头文件应该适用于 C 和C++程序。详情请看这里。
BTW包含双下划线的名称是为编译器保留的(以下划线和大写字母开头的名称也是如此(,因此严格来说#ifndef __MYLIB_H_
这是非法的。我会改成#ifndef MYLIB_H #define MYLIB_H
虽然接受的答案是绝对正确的,但我想我只是添加一个观察。某些编辑器在打开/关闭大括号时遇到问题,并且会在标题中缩进整个extern "C"
范围。如果mylib.h
是库的键头,则可以考虑:
#if defined (__cplusplus)
#define _MYLIB_INIT_DECL extern "C" {
#define _MYLIB_FINI_DECL }
#else
#define _MYLIB_INIT_DECL
#define _MYLIB_FINI_DECL
#endif
库中mylib
所有其他标头,例如 mylib_aux.h
,可以是以下形式:
#ifndef _MYLIB_AUX_H
#define _MYLIB_AUX_H
#include <mylib.h>
_MYLIB_INIT_DECL
... header content ...
_MYLIB_FINI_DECL
#endif /* _MYLIB_AUX_H */
显然,我使用的名称是任意的,但对于多个库标头,这种方法对我很有用。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 下面是我为检测链接列表中的循环而制作的代码
- 有了gcc,是否可以链接库,但前提是它存在
- 使用C链接在函数内部创建C++模板
- Visual Studio mkl_link_tool.exe链接错误
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 有人能帮我处理这个链接列表吗?C++