Linux下使用Eclipse C/C++生成创建并调用动态库(.so)

这篇博客介绍了在Lubuntu14.04上使用Eclipse Oxygen 4.7创建C/C++动态库的步骤,包括创建工程、设置-fPIC选项、编译生成.so文件。在使用动态库时,通过将库文件放在/usr/local/lib目录下,并更新共享库配置,解决了运行时找不到库文件的问题。

一、平台版本

Linux版本:Lubuntu14.04

eclipse版本:Oxygen 4.7

二、创建动态库

1、创建工程:File->New->C/C++ Project,选择C Managed Build

2、输入项目名,Project type选Shared Library->Empty Project,工具链选用Linux GCC

 3、新建源文件,New->Soure File,编写动态库代码(这里是简单测试因此没有创建头文件,可以另建目录放置源文件和头文件方便管理)

 

文中是linuxC++动态库 实现接口提供类导出的一个例子 注意其中使用函数返回基类指针的用法,因为Linux的动态链接库不能像MFC中那样直接导出类 一、介绍 如何使用dlopen API动态地加载C++函数和类,是Unix C++程序员经常碰到的问题。 事实上,情况偶尔有些复杂,需要一些解释。这正是写这篇mini HOWTO的缘由。 理解这篇文档的前提是对C/C++语言中dlopen API有基本的了解。 这篇HOWTO的维护链接是: http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/ 二、问题所在 有时你想在运行时加载一个库(使用其中的函数),这在你为你的程序写一些插件或模块架构的时候经常发生。 在C语言中,加载一个库轻而易举(调用dlopen、dlsym和dlclose就够了),但对C++来说,情况稍微复杂。 动态加载一个C++库的困难一部分是因为C++的name mangling (译者注:也有人把它翻译为“名字毁坏”,我觉得还是不翻译好), 另一部分是因为dlopen API是用C语言实现的,因而没有提供一个合适的方式来装载类。 在解释如何装载C++库之前,最好再详细了解一下name mangling。 我推荐您了解一下它,即使您对它不感兴趣。因为这有助于您理解问题是如何产生的,如何才能解决它们。 1. Name Mangling 在每个C++程序(或库、目标文件)中, 所有非静态(non-static)函数在二进制文件中都是以“符号(symbol)”形式出现的。 这些符号都是唯一的字符串,从而把各个函数在程序、库、目标文件中区分开来。 在C中,符号名正是函数名:strcpy函数的符号名就是“strcpy”,等等。 这可能是因为两个非静态函数的名字一定各不相同的缘故。 而C++允许重载(不同的函数有相同的名字但不同的参数), 且有很多C所没有的特性──比如类、成员函数、异常说明──几乎不可能直接用函数名作符号名。 为了解决这个问题,C++采用了所谓的name mangling。它把函数名和一些信息(如参数数量和大小)杂糅在一起, 改造成奇形怪状,只有编译器才懂的符号名。 例如,被mangle后的foo可能看起来像foo@4%6^,或者,符号名里头甚至不包括“foo”。 其中一个问题是,C++标准(目前是[ISO14882])没有定义名字必须如何被mangle, 所以每个编译器都按自己的方式来进行name mangling。 有些编译器甚至在不同版本间更换mangling算法(尤其是g++ 2.x和3.x)。 即使您搞清楚了您的编译器到底怎么进行mangling的,从而可以用dlsym调用函数了, 但可能仅仅限于您手头的这个编译器而已,而无法在下一版编译器下工作。 三、类 使用dlopen API的另一个问题是,它只支持加载函数。 但在C++中,您可能要用到库中的一个类,而这需要创建该类的一个实例,这不容易做到。 四、解决方案 1. extern "C" C++有个特定的关键字用来声明采用C binding的函数: extern "C" 。 用 extern "C"声明的函数将使用函数名作符号名,就像C函数一样。 因此,只有非成员函数才能被声明为extern "C",且不能被重载。 尽管限制多多,extern "C"函数还是非常有用,因为它们可以象C函数一样被dlopen动态加载。 冠以extern "C"限定符后,不意味着函数中无法使用C++代码了, 相反,它仍然是一个完全的C++函数,可以使用任何C++特性和各种类型的参数。
<think>嗯,用户想在Windows环境下用Eclipse C/C++创建C程序生成.so文件。首先,我需要回忆一下相关的步骤。记得Eclipse需要安装C/C++开发插件,也就是CDT。可能还需要编译器,比如MinGW或者Cygwin。但生成.so文件通常是Linux动态库,在Windows上应该是.dll,不过用户可能想用Cygwin模拟Linux环境来生成.so。 首先,用户需要安装Eclipse IDE for C/C++ Developers,或者安装Eclipse Classic然后添加CDT插件。参考引用[2]提到了需要Eclipse Classic加上Cygwin、CDT和NDK。不过用户的问题里没有提到Android,所以可能不需要NDK。不过生成.so的话,可能需要配置编译器为gcc,使用-shared选项。 接下来,安装Cygwin,确保安装了gcc-core、gcc-g++、make和binutils这些包,这样才有编译器工具链。然后,在Eclipse中配置Cygwin的路径,比如设置环境变量或者在Eclipse的Preferences里添加工具链路径。 创建项目时,要选择C项目,然后选择Shared Library类型,这样生成的项目会自动配置生成.so文件。用户需要编写代码,比如一个简单的函数,然后在项目属性里检查编译命令是否包含-fPIC和-shared选项。可能还需要在链接器设置里添加这些参数。 编译后,生成.so文件应该在项目的Debug或Release目录下。用户可能还需要配置构建命令,比如使用makefile,但Eclipse通常会自动生成这些配置。另外,要注意Windows下使用Cygwin路径的问题,可能需要正确设置PATH环境变量,确保运行时能找到依赖的库。 用户可能遇到的问题包括编译器路径配置错误,或者缺少必要的库。需要检查Eclipse中的编译器设置,确保指向Cygwin的gcc。另外,如果代码中有平台特定的函数,可能需要修改代码以兼容Windows下的Cygwin环境。 最后,测试生成.so文件是否可用,可能需要编写一个测试程序,配置运行时环境来加载.so。不过Windows下通常用.dll,用户可能需要确认是否真的需要.so,或者是否可以使用MinGW生成.dll文件,这可能更简单。但根据引用[2]和引用[4],使用Cygwin可以生成.so,所以按照步骤操作应该可行。</think>### 在Windows环境下使用Eclipse C/C++创建C程序编译生成.so文件 #### **步骤1:安装必要工具** 1. **安装Eclipse IDE for C/C++ Developers** 下载安装Eclipse IDE的C/C++版本[^1],或通过Eclipse Classic安装CDT插件(C/C++ Development Tooling)[^2]。 2. **安装Cygwin或MinGW** - **Cygwin**:提供类Linux环境,支持生成.so文件。安装时需包含`gcc-core`、`gcc-g++`、`make`、`binutils`包[^2][^3]。 - **MinGW**:生成Windows原生DLL文件,若需.so文件需结合Cygwin环境[^4]。 3. **配置环境变量** 将Cygwin的`bin`目录(如`C:\cygwin64\bin`)添加到系统PATH变量,确保终端可调用`gcc`。 --- #### **步骤2:创建C项目** 1. 打开Eclipse,选择 **File → New → C Project**。 2. 输入项目名称,选择 **Project type → Shared Library**,工具链选择 **Cygwin GCC** 或 **MinGW GCC**(根据安装环境)[^2]。 3. 完成创建后,编写C代码(示例): ```c // example.c #include <stdio.h> void hello() { printf("Hello from shared library!\n"); } ``` --- #### **步骤3:配置编译选项** 1. **右键项目 → Properties → C/C++ Build → Settings**。 2. **GCC C Compiler → Miscellaneous**:添加编译选项 `-fPIC`(生成位置无关代码)。 3. **GCC C Linker → Shared Library Settings**: - **Library name**:输入`example`(生成`libexample.so`)。 - **Miscellaneous**:添加选项 `-shared`[^3]。 --- #### **步骤4:编译生成.so文件** 1. 点击 **Project → Build Project**,生成文件位于`项目目录/Debug`或`项目目录/Release`下。 2. 若报错“未找到gcc”,检查Cygwin/MinGW路径配置(**Window → Preferences → C/C++ → Build → Environment**)[^4]。 --- #### **验证生成结果** 在Cygwin终端中检查文件类型: ```bash file libexample.so ``` 输出应为: `libexample.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped` --- ### **关键问题与解决** 1. **编译失败:缺少依赖** 确保Cygwin安装了所有开发包(`gcc-core`、`make`等)。 2. **无法生成ELF格式文件** 使用Cygwin的`gcc`而非MinGW,因MinGW默认生成PE格式(Windows可执行文件)[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值