eclipse 下 c/c++编译.so库,使用.so库(linux)

C/C++动态加载So编程 dladdr、dlclose、dlerror、dlopen、dlsym等动态链接加载器的编程接口和示例。 阅读详情

首先需要安装好eclipse 的cdt编译的环境。配置好gcc 编译环境。lunix 一般情况下都会有gcc ,windows就需要装个cygwin。

一、建立一个动态连库(.so文件)

1、先在eclipse中创建一个共享库工程

File->New->Project->C Project,选择Shared Library,选择empty project

2、创建工程的源文件share.cpp

File->New->Source Folder,指定名称为src

File->New->Source file,指定名称为share

最后的目录结构:



3、编写c代码以及c头文件


#include <stdio.h>
#include <stdlib.h>

void sayhello(){

	printf("hello !!1");

}

头文件:


void sayhello();

3、build project

会出现错误信息如下:

**** Build of configuration Debug for project share ****


make all 
Building file: ../src/share.c
Invoking: GCC C Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/share.d" -MT"src/share.d" -o "src/share.o" "../src/share.c"
Finished building: ../src/share.c
 
Building target: libshare.so
Invoking: GCC C Linker
gcc -shared -o "libshare.so"  ./src/share.o   
/usr/bin/ld: ./src/share.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
./src/share.o: could not read symbols: Bad value
collect2: ld 返回 1
make: *** [libshare.so] 错误 1


**** Build Finished ****

错误信息表示在编译时候需要 -fPIC 参数。

具体是这句缺少-fPIC参数

gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/share.d" -MT"src/share.d" -o "src/share.o" "../src/share.c"

需要加上-fPIC:

project->properties->c/c++ build -> setting->GCC C Compiler的commend中从原来的gcc 修改为gcc -fPIC

再次编译通过。信息如下:

**** Build of configuration Debug for project share ****


make all 
Building file: ../src/share.c
Invoking: GCC C Compiler
gcc -fPIC -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/share.d" -MT"src/share.d" -o "src/share.o" "../src/share.c"
Finished building: ../src/share.c
 
Building target: libshare.so
Invoking: GCC C Linker
gcc -shared -o "libshare.so"  ./src/share.o   
Finished building target: libshare.so
 


**** Build Finished ****


二、调用编译出来的.so文件。

1、先在eclipse中创建一个可执行工程

File->New->Project->C Project,选择Execuable Library,选择empty project

2、创建工程的源文件share.cpp

File->New->Source Folder,指定名称为src

File->New->Source file,指定名称为hello.c

3、复制share的头文件,因为需要引用shar.so的函数。编写hello.c文件


这里在编译的时候要引用到刚才建立的share.so共享库:

project->properties->c/c++ build -> setting->GCC C Linker 中的libraries引入库路径和库名称



不然会出现找不到函数问题如下:

**** Build of configuration Debug for project hello ****


make all 
Building target: hello
Invoking: GCC C Linker
gcc  -o "hello"  ./src/hello.o   
./src/hello.o: In function `main':
/ws/jack/Android/projects/testPorject/hello/Debug/../src/hello.c:11: undefined reference to `sayhello'
collect2: ld 返回 1
make: *** [hello] 错误 1


**** Build Finished ****


三、运行工程

出错!!!

/ws/jack/Android/projects/testPorject/hello/Debug/hello: error while loading shared libraries: libshare.so: cannot open shared object file: No such file or directory

找不到库文件。


原来lunix运行c/c++程序跑到默认路径去找这个share库文件了,但是肯定找不到。因为没把库放到默认路径里面。

这有两个办法指定运行时候库文件的路径:

一种,是设置系统的LD_LIBRARY_PATH 环境变量(在eclipse里设置对外部正式运行的程序无效)。

另外一种,是将动态链接库文件的路径编译进二进制可执行文件。-R+路径。


我的就利用LD_LIBRARY_PATH运行环境变量去设置路径了。设置成libshare.so的路径。

project->run as ->run configurations->Environment




参考:

http://blog.sina.com.cn/s/blog_7769660f01011pf1.html

http://hi.baidu.com/sfzhaoif/item/32ecf6bfe055b542bb0e1209

http://stackoverflow.com/questions/14448343/cannot-open-shared-object-file-no-such-file-or-directory-running-or-debugging

http://www.linuxidc.com/Linux/2012-08/68828.htm

再次运行 ,就可以出来调用的结果了





Eclipse CDT生成、调用C动态库 (一) 生成动态库 1 创建动态库工程 File->New->Project->CProject->选择Shared Library,工程命名为test。   2 创建源代码文件 File->New->Source File,指定名称为test.c,内容: #include using namespacestd; void show() {     cout } 编 阅读详情

相关推荐

Linux C++,so动态库 示例实例

Linux C++,so动态库 示例实例 本文以Eclipse集成开发环境为例进行说明。 # 一、主要步骤 **(1)创建动态连接库(.so)工程** (1.1)建立.so工程; (1.2)添加MyHelloworld.cpp、MyHelloworld.h文件 (1.3)添加 -fPIC编译选项 (1.4)新增自定义成员函数:PrintHelloWorld函数 ............

Adunn的专栏 9077

eclipse中加载C/C++源文件生成对应的so文件(图文教程) 2020最新

准备工作: 确保eclipse正确配置了ndk开发环境; 第一步、新建一个安卓项目 第二步、添加一个ndk支持 第三步、引入jni支持 第四步、在jni文件夹下创建(.c、.h、Android.mk、Application.mk)等文件; 项目结构 .c文件:安卓调用的so文件里方法的具体实现; .h文件:.c文件里用到的方法(类似java里的接口定义)和结构体(类似java里的实体类)的定义; Android.mk文件:标注了SO文件生成相关的信息,例如生成路径、生成名称、引

wangkai13810651628的博客 798

Ubuntu(Linux)使用Eclipse搭建C/C++编译环境

<br /> <br />首先是安装Eclipse,方法有两种: <br />       第一种是通过Ubuntu自带的程序安装功能安装Eclipse,应用程序->Ubtuntu软件中心,搜Eclipse安装即可。<br />       第二种方法是用命令:应用程序->附件->终端<br />                                       然后输入(中间可能需要你输入密码):<br />                                       sudo

mcy478643968的专栏 1166

在linux操作系统上使用eclipse开发C++项目--引用so文件问题

项目中,需要在linux操作系统内,使用eclipse编辑器开发,每个项目均使用automake,如下图。 C/C++ Build-->Builder Settings-->generate make file auto... 如下图,在"C/C++ General"中的"Paths and Symbols"中的"Reference"选项卡内,选中引用的本地动态链接库(so)项

zhangxiyin6950的专栏 1127

linux下使用eclipse编译live555

之前已经将过linux中编译live555,但是按照那样的方法编译生成的是静态库,本文讲解使用eclipse编译live555生成动态库,其实静态库也就是修改一下编译输出类型即可。 1、下载源码      从网上下载live555的最新源代码,本文也提供所使用的源代码,如果不想通过官网下载可以选择从这个地址进行下载:       http://download.csdn.net/

三言两语 1941

从华为杯建模到论文录用:我的Biomedical Signal Processing and Control投稿全记录(含Latex模板与审稿人推荐技巧)

本文详细记录了作者从华为杯数学建模竞赛到Biomedical Signal Processing and Control期刊投稿的全过程,分享了如何将竞赛成果转化为学术论文的实用技巧,包括LaTeX排版中的常见陷阱与解决方案,以及审稿人推荐策略。特别提供了针对Elsevier模板的优化建议和高效回复审稿意见的方法,适合生物医学信号处理领域的研究者参考。

weixin_42549037的博客 454

C++编写、生成、调用so库详解(一)

开发中经常会用到so库,大多是调用第三方的so库,偶尔也需要自己封装一个so库给别人调用,这边就记录一下开发so库的一个过程.首先我们这边是在Android Studio中开发的,所以仅描述在Android环境下开发过程,当然也可以用其他工具开发.

田一一的博客 5484

C语言入门—初识C语言

一、C语言概述 1、什么是C语言 语言是用来交流沟通的,有一方说,有一方听。必须要两方参与。(自言自语的除外) 语言是人与人交流,而C语言是人与机器交流 语言有独特的语法规则和定义,双方必须遵循这些规则和定义才能实现真正的交流。 接下来首先了解下计算机的组成: 2、计算机介绍 2.1、计算机结构组成 2.2、计算机系统组成 2.3、程序的指令 指令是对计算机进行程序控制的最小单元 计算机的指令系统是指所有指令的集合 程序是指为完成某一项特定任务而用某种言语编写的一组指令序列 3、C语言发展历程 3.

jun319817的博客 1035

C++环境部署-使用Eclipse生成JNI C++So库

文章目录1.安装JDK,配置环境变量2.解压eclipse、sdk、NDK3.安装本地ADT4.配置sdk路径、NDK路径5.导入工程代码 2017年的时候需要交接对接安卓服务的同事的工作,交接了他负责的几个So代码; 交接时也算是手把手配置了JNI的环境;当前重复了好几次,总算是可以能从一台空白机器上搭建出一个可以编译生成So的环境; 当时写了一个文档记录了下来,最近整理文档,正好可以放到优快云上,方便以后自己查找资料方便,因为我是个大迷糊啊; 本文中需要的各种压缩库,在百度网盘:链接:https://

黑山老妖的博客 502

NVMe与PCIe的完美结合:高速存储背后的技术解析

本文深入解析了NVMe与PCIe技术如何完美结合,实现高速存储性能的飞跃。从机械硬盘到NVMe SSD的进化历程出发,详细介绍了PCIe总线的高带宽优势与NVMe协议的低延迟设计,以及两者协同工作带来的显著性能提升。通过实测数据对比,展示了NVMe SSD在消费级和企业级应用中的卓越表现,并提供了选购与优化建议。

weixin_29216353的博客 376

保姆级教程:用Arduino+MPU6050自制寻北仪(附MEMS陀螺精度测试报告)

本文提供了一份详细的Arduino与MPU6050自制寻北仪的保姆级教程,包括硬件选型、卡尔曼滤波算法优化、地磁场补偿及真北计算等关键技术。通过实测数据展示了MEMS陀螺仪在民用领域的高精度性能,帮助读者低成本实现1°以内的寻北精度。

weixin_42522964的博客 364

在eclipse里配置Android ndk环境 适用于windows mac 和linux(转)

在eclipse里配置Android ndk环境 适用于windows mac 和linux(转) 2012-02-27 13:02:16|分类:android|标签:javaprogramandroid|举报|字号订阅 原文:http://www.migantech.com/blog/codes/2011/11/28/%E5...

diaobaoxi6521的博客 127

实战复盘:如何用Frida脚本绕过某书APP的libmsaoaidsec.so检测(附完整Hook代码)

本文深入探讨了如何利用Frida脚本绕过某书APP通过libmsaoaidsec.so实现的反Frida检测机制。通过分析动态链接过程中的关键节点和检测模式,提供了两种实战验证的绕过方案:动态Hook关键链接器函数和静态Patch SO文件。文章还分享了进阶对抗策略和调试技巧,帮助安全研究人员有效应对现代移动安全防护挑战。

weixin_42706667的博客 219

java调用dll或so动态库文件(c++/c)

一篇老文章,拿来用一下。 开发平台:Eclipse3.3.1.1+CDT(cdt-master-4.0.3)+MinGW(MinGW-5.1.4) 1. java调用dll的实现 1.1 环境准备 1.1.1 下载并安装cdt http://www.eclipse.org/cdt/downloads.php 选择自己eclipse 支持的cdt插件,下载,并且通过eclipse–>software update–>find and install 安装cdt。 1.1.2 下载并安装mingw

cnhome的专栏 891

从零开始,手把手教你用RTL代码设计一个简单的8位CPU(附状态图与ALU设计)

本文详细介绍了如何从零开始设计一个简单的8位CPU,包括状态机设计、ALU实现与RTL编码实战。通过具体的指令集分析、状态图设计和Verilog代码示例,帮助读者深入理解CPU工作原理,并掌握RTL代码编写技巧。特别适合计算机系统学习者和硬件设计爱好者。

weixin_30847063的博客 320

STM32 野火MINI 用FontCvtST.exe 生成.c文件 写汉字到文本框 按钮上

STM32 野火MINI 用FontCvtST.exe 生成.c文件 写汉字到文本框 按钮上 参考了好多大神博客,自己写的过程中发现,还有些小细节。 一、打开Notepad写需要的字 另存为 UTF-16LE 也就是Unicode。 二、打开FontCvtST转 删掉所有字 读入test.txt里的字 选择刚才的test.txt 另存为.c文件 改个英文名 复制到RTOS的例程文件夹下 三、打开GUIBuilder 画一个这样的 保存之前要注意路径配置要在当前位置,否则存不上 生成的D

weixin_41376117的博客 1935

linux下eclipse构建并编译android一个简单jni项目

<br />因为项目要在nand和sdcard上搜索某一类型的文件,用java来实现速度太慢,因此要自己来写jni的代码,于是热热手先写一个简单写了一个简单的例子<br />第一,java源代码的编写,在eclips下面新建android工程,创建helloJNI.java<br /> <br />package com.john.helloJNI;<br /><br /> import android.app.Activity;<br /> import android.os.Bundle;<br /

abc的专栏 2502

AI学习指南RAG篇(19)-API调用与集成

通过上述API调用示例,您可以方便地将RAGFlow与其他系统集成,实现数据集管理、文档处理、会话管理等功能。希望本文的介绍能帮助您更好地理解和使用RAGFlow的API。

俞兆鹏的博客 2546

Android NDK编程入门

(转自http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html) 入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的。 一、 开发环境的搭建 a.  android的NDK开发需要在linux下进行: 因为需要把C/

张亮校的专栏 522

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

虚拟机一开eclipse就卡死_eclipse虚拟机崩溃

好像win下只能调用dll,既然你是用c/c++开发的库,那就应该尽可能的使用跨平台的api,win下发布为dll,linux下发布为so。就像汽车靠轮子走,轮船靠螺旋桨走是一个道理,虽然都是发动机带动。so是linux下编译的库文件而dll是win平台的是不是win上面安装了EcgAnalysis,linux上面没有安装EcgAnalysis类?你可以去看一些跨平台的解决方案,例如Eclipse...

weixin_39549852的博客 401

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

cocos2d-x学习笔记(一)——安装篇

小结:cocos2d-x安装环境的配置与版本有很大关系,cocos2d-x1.0系列版本的程序可以在Android2.2以上版本的虚拟机上运行,cocos2d-x2.0以上版本不可以在Android虚拟机上运行(我测试的结果),当然,cocos2d-x的任何版本都可以在真机上运行的。在安装cocos2d-x环境的时候,最大的问题就是cocs2d-x版本和Andorid虚拟机版本不兼容的问题。建议c

yy20110722的专栏 1187

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Linux下Eclipse进行C++编程动态库so的生成与使用

本文主要介绍了Linux使用Eclipse进行C++编写动态库so 的生成与使用方法,提供示例代码,并给出部分编译错误的解决方案。

Ron的专栏 9372

linux把c 项目生成so库,Linux下使用Eclipse C/C++生成创建并调用动态库(.so)

一、平台版本Linux版本:Lubuntu14.04eclipse版本:Oxygen 4.7二、创建动态库1、创建工程:File->New->C/C++ Project,选择C Managed Build 2、输入项目名,Project type选Shared Library->Empty Project,工具链选用Linux GCC 3、新建源文件,New->Soure...

weixin_33603316的博客 692

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

一、平台版本 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、新建源文件,N...

Chancer224的博客 622

linux c++编译so,linux下将c++编译成so,调用该so文件

在其他资料上增加了过程中遇到的问题。so文件为动态链接库文件,与windows下的dll文件相当,Linux下系统so文件一般保存在/usr/lib中。下面就说明一下如何生成c++程序的so文件,以及如何在c++程序中调用该so文件==========test.h===========#ifdef __cplusplus //extern "C"{#endifclass Test{public:i...

weixin_42377538的博客 1124

eclipse java调用 so_Liunx java-eclipse下C++的so庫的調用(上)

歡迎轉載,轉載請說明。網上很多界紹使用JAVA調用C/C++的SO庫,但從例子中大多都是一個簡單的C語言文件,然后進行編譯打庫。這些例子只能帶給我們了解打庫和調用步驟,在實際項目過程中,遇到的並非想象中的哪么簡單。下面我將以一個C++的例子來演示從打庫到調用的全過程,希望對初學者有用,大蝦,大牛一邊過,歡迎圍觀。例子:有一個汽車類接口ICar ,其中聲明了幾個基本方法,同時有一個phorsche(...

weixin_33069291的博客 267
上一篇: 关于向父view添加相同的view问题!The specified child already has a parent. You must call removeView() on the chil
下一篇: 编译ffmpeg 2.6.3 h264
jackcoder
博客等级 码龄14年 2粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值