linux 练习五 如何生成库.so及被C和C++程序可用

题目:实现一个so库文件名称为listupper.so,so文件中实现一个函数,函数名为void upper(const char *src, char *desc),
调用update后将参数src所指向的字符串中所有字符转化为大写字母,结果放入desc字符串中。分别用C语言编写一个程序test1,

调用libupper.so中的upper函数,用C++语言编写一个程序test2,调用libupper.so中的upper函数


upper.c 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "upper.h"
int upper(const char * const src, char * const dst,int len)
{
    int i = 0;
    if((0 == len) || (NULL == src) ||(NULL == dst))
    {
        return -1;
    }
    if((src + len) > dst)
    {
        return -1;    
    }

    for(i = 0; i < len; i++)
    {
        if((src[i] >= 'a') && (src[i] <= 'z'))
        {
            dst[i] = src[i] - ('a' - 'A');
        }
        else
        {
            dst[i] = src[i];
        }                    
    }
    return 0;
}

upper.h
#ifndef __UPPER__
#define __UPPER__

#include <stdio.h>

#ifdef __cplusplus
extern "C"
{    
#endif
extern int upper(const char * const src,char * const dst,int len);

#ifdef __cplusplus
}    
#endif

#endif

//uppertest.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "upper.h"

int main(int argc, char * argv[])
{
    char *src = "abvf#@13654";
    char dst[100];
    printf("src=%s\n",src);
    if(upper(src,dst,strlen(src)) < 0)
    {
         perror("upper");
         exit(1);
    }
    else
    {      
         printf("dst = %s\n",dst);
    }
}

//uppertestcpp.cpp

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#ifdef __cplusplus                //C++程序 兼容调用C库
extern "C"
{
#endif
#include "upper.h"
#ifdef __cplusplus               //C++程序 兼容调用C库
}
#endif
int main(int argc, char * argv[])
{
    char* s="atesg^*()";
    char buf[30];
    memset(buf,0,sizeof(buf));

    printf("src=%s\n",s);
    if(upper(s,buf,strlen(s)) < 0)
    {
        cout<<"upper error!"<<endl;
    }
    else
    {
        printf("dst=%s\n",buf);
    }
}


book@ubuntu:~/watchman$ gcc -fpic -shared -o libupper.so upper.c 

book@ubuntu:~/watchman$ export LD_LIBRARY_PATH=/home/book/watchman
book@ubuntu:~/watchman$ gcc uppertest.c -L. -lupper -o uppertest.o
book@ubuntu:~/watchman$ ./uppertest.o 
src=abvf#@13654
dst = ABVF#@13654
book@ubuntu:~/watchman$ 

book@ubuntu:~/watchman$ g++ uppertestcpp.cpp -L. lupper -o uppertestcpp
g++: error: lupper: 没有那个文件或目录
book@ubuntu:~/watchman$ g++ uppertestcpp.cpp -L. -lupper -o uppertestcpp
uppertestcpp.cpp: In function ‘int main(int, char**)’:
uppertestcpp.cpp:15:13: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
     char* s="atesg^*()";
             ^
book@ubuntu:~/watchman$ ./uppertestcpp 
src=atesg^*()
dst=ATESG^*()
book@ubuntu:~/watchman$ 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值