我试图将静态库(与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
我什至尝试在test.cpp中添加extern命令:
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
我正在将Code::Blocks IDE(v13.12)与GNU GCC编译器一起使用。 我想使用链接器链接我的程序所需的运行库的静态版本,我可以怎么做 我已经知道我的可执行文件的大小会增加,你能告诉我其他的缺点吗 在Visual C Express中执行此操作怎么样
本文向大家介绍Go编译32位GNU静态链接库的方法,包括了Go编译32位GNU静态链接库的方法的使用技巧和注意事项,需要的朋友参考一下 Go链接库系统的难用可谓是人尽皆知,不同Go版本编译出来的不兼容,而且只支持GNU的,不能编译出Windows上的dll和lib。 本次有需求是将Go代码编译成32位GNU静态链接库。 Go代码 编写代码如下: 注意我们必须把想要导出的函数显式使用//export
当试图将Irrlicht静态库包含到我的cmake项目中时,您出现了一个编译错误 我不明白为什么它说它找不到,尽管我已经包含了X11库。
问题内容: Java 8之前的Java版本要求本机代码必须位于共享库中,但是我已经读到Java 8可以在JNI中使用静态链接库。我已经搜索了示例,但找不到任何示例。 如何将JNI库静态链接到Java应用程序? 问题答案: Java SE 8规范已更改为支持静态链接,并且静态链接在JDK中实现。在System.loadLibrary的规范中对此进行了简要介绍。它所引用的JNI规范的各个部分在此处和此
我有一个测试文件(仅用于链接测试),在该文件中,我用自己的/库重载/
问题内容: 我想修改setup.py文件,以便命令“ python setup.py build”编译基于C的扩展模块,该模块静态(而非动态)链接到库。 该扩展程序当前动态链接到许多库。除了静态链接到一个库外,我想保留所有内容。我已经成功地通过手动修改了对distutils运行的gcc的调用来完成了此操作,尽管它要求我明确列出相关库。 也许这是太多信息,但是为了清楚起见,这是在“ python s