实现一个so库文件名称为libupper.so提供给c/cpp调用

要求:

    实现一个so库文件名称为libupper.so,so文件中实现一个函数,函数名为void
upper(const char *src, char *desc).

调用upper后将参数src所执行的字符串所有字符转化为大写字母,结构放入到desc字符串中。分别用c语言编写一个

程序test1,调用libupper.so中的upper函数。用c++语言辩词额一个程序test2,调用libupper.so中的upper函数。

//upper.c

#include <string.h>
void upper(const char *src, char *desc)
{
    int len = strlen(src);//获取字符串长度
    int i = 0;
    for (; i < len; i++)
    {
        if ((src[i]>='a')&&(src[i]<='z'))//如果为小写
        {
            desc[i] = src[i] - 0x20;//转化为大写
        } else
        {
            desc[i] = src[i];
        }
    }
}

//upper.h

#ifndef UPPER_H_
#define UPPER_H_
#ifdef __cplusplus
extern "C"{//c,cpp混合编程
#endif
void upper(const char *src, char *desc);
#ifdef __cplusplus
}
#endif
#endif /* UPPER_H_ */

//makefile

.SUFFIXES: .c .o
CC=gcc
SRCS=upper.c

OBJS=$(SRCS:.c=.o)
EXEC=libupper.so
all: $(OBJS)
    $(CC) -shared -o $(EXEC) $(OBJS)
    @echo '-------------ok--------------'
.c.o:
    $(CC) -Wall -g -fPIC -o $@ -c $<
clean:
    rm -f $(OBJS)
    rm -f core*

//test1.c test2.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "upper.h"
int main()
{
    const char *s = "abc123def";
    char buf[100];
    memset(buf, 0, sizeof(buf));
    upper(s, buf);//将s转化为大写字符串
    printf("%s\n", buf);
    return 0;
}

make 编译生成libupper.so

wuyingqiang@ty-kf1:~/1$ ls

Makefile  test1.c  test2.cpp  upper.c  upper.h

wuyingqiang@ty-kf1:~/1$ make

gcc -Wall -g -fPIC -o upper.o -c upper.c 

gcc -shared -o libupper.so upper.o 

-------------ok--------------

gcc test1.c -o test1 -L. -lupper

g++ test2.cpp -o test2 -L. -lupper

执行程序的时候,总是报错找不到库文件。

wuyingqiang@ty-kf1:~/1$ ./test1

./test1: error while loading shared libraries: libupper.so: cannot open shared object file: No such file or directory

解决方法:

cd 回到宿主目录

vim .bash_profile

PATH=$PATH:$HOME/bin:.

export PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

然后保存文件

. .bash_profile 使其生效。

时间: 2024-09-19 08:59:56

实现一个so库文件名称为libupper.so提供给c/cpp调用的相关文章

记一个链接库导出函数被覆盖的问题

链接库的一个问题 前些天遇到这样一个问题:libD.so需要用到libS.a提供的方法,于是静态链接了libS.a.而libS.a和libD.so又都会被可执行文件bin所链接.(因为libD.so还提供给其他可执行程序使用,所以链接libS.a是必须的.而libD.so对于bin来说是可选的,所以bin也必须链接libS.a.)这就形成下面一种情况: libD.so <---- bin | | libS.a <-------- 那么,如果今后libS.a有所修改(成了libS_new.a),

eclipse-问一下,,我eclisp关联了一个第三方库,我想再关联一个,或者将另一个移到工程里,怎么弄

问题描述 问一下,,我eclisp关联了一个第三方库,我想再关联一个,或者将另一个移到工程里,怎么弄 问一下,,我eclisp关联了一个第三方库,我想再关联一个,或者将另一个移到工程里,怎么弄?而且在我给libs放入jar包.clean不生成gen目录,没有R文件.报错 解决方案 如果是jar直接放在libs下面就好了,没有R一般是布局文件问题,仔细找找,如果是源码直接导入工程,在属性里面设置其Is Library前面打勾保存 在想要应用的工程属性里面添加一下就好了 解决方案二: http://

android studio-在Android Studio 导入一个第三方库,在我自己的项目中怎样来使用它

问题描述 在Android Studio 导入一个第三方库,在我自己的项目中怎样来使用它 第三方库是 extras 目录下的android-pdfview-master 要引用其包里面的文件该怎么写路径,import 路径是什么 解决方案 导入成功了,你就可以使用了,你只不过不知道怎么使用吧!看看有没有readme之类的说明文档,没说明文档那谁知道你写的接口怎么用,或者去网上看看 解决方案二: 现在github上好多项目都已经使用android studio......答案就在这里:使用Andr

配置-我用SSH框架做的一个试题库系统,点一些按钮时没有反应

问题描述 我用SSH框架做的一个试题库系统,点一些按钮时没有反应 我用SSH框架做的一个试题库管理系统,当我点击比如增加章节按钮但没有反应,控制台上也没有显示信息,页面也不跳转请问是什么原因? 这是我的增加的那个action方法 public void insertCharpter() throws Exception { request = ServletActionContext.getRequest(); response = ServletActionContext.getRespons

makefile把一个 .cpp文件和它所依赖的几个 .a(静态库文件 ) 生成一个动态库文件.so

问题描述 makefile把一个 .cpp文件和它所依赖的几个 .a(静态库文件 ) 生成一个动态库文件.so 假设编译交叉编译工具路径为dir1(arm-linux-androideabi-gcc-4.9 ),存放生成的.so文件的路径为dir2,test.cpp,依赖1.a,2.a,3.a这三个静态文件库,Makefile文件应该怎么写 解决方案 arm-linux-androideabi-gcc-4.9 -fPIC -shared -o dir2/xxx.so test.cpp 1.a 2

url解析-如何通过一个URL获取文件名和文件类型

问题描述 如何通过一个URL获取文件名和文件类型 我想自己搭建一个离线下载服务器,怎样能通过一个URL获取这个文件的文件名和文件类型 比如http://www.baidu.com/a/b/c/index.php?a=1&b=2这样子的 还比如url中有中文编码%B7%E5%A3%AB.mp4这种的 还比如http://www,baidu.com/?a=b&c=d这样的 假如是iis服务器在响应头中甚至没有Content-Type filename 求一个统一点的解决办法 解决方案 对了还有

用JS写的一个Ajax库(实例代码)_javascript技巧

myajax是一个用js编写的一个跨浏览器的ajax库,支持get, post, jsonp请求,精巧,简单. 一.发送GET请求: myajax.get({ <span style="white-space:pre"> </span>data: {}, //参数 url: "", //请求地址 //发生错误是调用 error: function(data) { }, //请求成功调用 success: function(data){ <

sqlalchemy-mysql 从一个库 DA 选择表 TA 内容,插入到另一个 DB 库的 TB 中

问题描述 mysql 从一个库 DA 选择表 TA 内容,插入到另一个 DB 库的 TB 中 如果两个库是一台物理机大概~ INSERT INTO DB.TB SELECT * FROM DA.TA WHERE .... 但是如果是两个库分别属于两个物理机~~ 我使用 sqlalchemy~ 第一段 fet = sesssionA.execute('SELECT * FROM TA WHERE ...').fetchall() 第二段 ''' 根据 fet 构造成 dict''' 第三段 ses

打印问题。想打印网页上的局部,是一个表格,这个表格是动态生成的,虽然调用数据库内容,但是调用的数据来自不同库,根据内容动态生成。

问题描述 打印问题.想打印网页上的局部,是一个表格,这个表格是动态生成的,虽然调用数据库内容,但是调用的数据来自不同库,根据内容动态生成. 解决方案 解决方案二:坛子里有很多了,可以查一下呀