makefile学习经验(三)编译生成动态库文件(方式一)

摘要:
在Lunix下生成动态库文件:的含义。o、 ,。一所以之前已经介绍了文件类型。包含的文件。所以后缀是动态库文件。

Lunix下生成动态库文件:

         之前已经介绍了.o,.a,.so文件类型的含义,.so后缀的文件是动态库文件。

        下面介绍在编译过程中链接到动态库文件的方法:

一.   源码文件:

so_test.h:

void test_a();

void test_b();

void test_c();

test_a.c:

#include "so_test.h"

void test_a()

{

    printf("this is in test_a...\n");

}

test_b.c:

#include "so_test.h"

void test_a()

{

    printf("this is in test_b...\n");

}

test_c.c:

#include "so_test.h"

void test_a()

{

    printf("this is in test_c...\n");

}

test.c:

#include "so_test.h"

int main()

{

test_a();

test_b();

test_c();

return 0;

}

二.Makefile文件:

#*****************************************************************************

# Copyright        :  

#

# Author           :   huochangjun

# Date             :   2012-08-16

# Version           :   Demo1 动态链接库

# Description             :   Demo

#

#****************************************************************************/

SHELL = /bin/sh

LIB_DIR = /cbs/lhbb/hcj/dy2/lib/

BIN_DIR = /cbs/lhbb/hcj/dy2/bin/

OBJECT_DIR = /cbs/lhbb/dy2/test/obj/

APP_DIR = /cbs/lhbb/hcj/dy2/testapp/

$(shell mkdir -p ${LIB_DIR})

$(shell mkdir -p ${BIN_DIR})

$(shell mkdir -p ${OBJECT_DIR})

RM = rm -fr

#****************************************************************************

CC = gcc

SHARED = -shared -o

FPIC = -fPIC -c

SRC_OBJECT = $(APP_DIR)test_a.c $(APP_DIR)test_b.c $(APP_DIR)test_c.c

H_OBJECT = $(APP_DIR)so_test.h

OBJECT = test_a.o test_b.o test_c.o

DY_SRC_OBJECT = $(APP_DIR)test.c

DY_OBJECT=test.o

LIB_OBJECT = libtest.so

BIN_OBJECT = test

#****************************************************************************

.PHONY:all

all:$(LIB_OBJECT) $(BIN_OBJECT)

$(LIB_OBJECT):$(OBJECT)

        $(CC) $(OBJECT) $(SHARED) -fPIC -o $(LIB_OBJECT)

        mv $(LIB_OBJECT) $(LIB_DIR)

$(OBJECT):$(SRC_OBJECT) $(H_OBJECT)

        $(CC) $(FPIC) $(SRC_OBJECT)

$(BIN_OBJECT):$(DY_OBJECT)

        $(CC) $(OBJECT_DIR)$(DY_OBJECT) -L$(LIB_DIR) -ltest -o $(BIN_OBJECT)

        mv $(BIN_OBJECT) $(BIN_DIR)

$(DY_OBJECT):$(DY_SRC_OBJECT)

        $(CC) -c $(DY_SRC_OBJECT)

        mv $(OBJECT) $(DY_OBJECT) $(OBJECT_DIR)

clean:

        $(RM) $(LIB_DIR) $(BIN_DIR) $(OBJECT_DIR)

三.makefile文件的简单阐述:

基本的变量赋值在生成静态库文件已经介绍了,这边就不再重复了。

和静态库文件的生成不同的是,编译的命令不同:

1.$(CC) $(OBJECT) $(SHARED) -fPIC -o $(LIB_OBJECT)

----这边$(SHARED)变量是:-shared –o 是编译动态库必须使用的;

  -fPIC 编译位置独立的代码,任何位置可以使用,达到共享内存;

2. $(CC) $(OBJECT_DIR)$(DY_OBJECT) -L$(LIB_DIR) -ltest -o $(BIN_OBJECT)

---- -L$(LIB_DIR) –ltest:ltest是固定的,取生成的动态库文件文件名去掉lib和后缀,然后加上l,这行命令就是在目录下寻找动态库文件,链接上动态库文件;

四.查看可执行文件是否链接上动态库文件:

执行make后,生成的目录结构和静态库文件一样,此时用命令ldd libtest.so查看是否链接上动态库文件:

libtest.so =>not found:显示这样的结果说明可执行文件没有链接上动态库文件,现在有如下两种方式去处理:

  1. 用root用户登陆环境,进入etc目录,在ld.so.conf文件后增加你要链接的路径,然后执行ldconfig即可,这样修改后,你目录下的动态库文件就是全局的,而非个人环境中的;
  2. 修改个人环境中的.cshrc文件,在文件中设定共享目录:

  setenv LD_LIBRARY_PATH /cbs/lhbb/hcj/dy2/lib:${LIBPATH};

  这样在每次登陆你的个人环境的时候,才会将LD_LIBRARY_PATH重新赋值,影响的仅仅是你的个人环境;

五.以上的方式是在makefile文件中完成对动态连接库的链接过程,无需在源文件中去处理;

免责声明:文章转载自《makefile学习经验(三)编译生成动态库文件(方式一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇揭秘阿里巴巴的客群画像IIS7设置限制IP地址访问下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

sysbench对自装MySQL数据库进行基准测试

一、 安装sysbench wget https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh chmod +x script.rpm.sh ./script.rpm.sh yum install -y sysbench 二、准备测试表 sysbench //...

从 C++ 到 Qt(命令行编译)good

从 C++ 到 Qt 转载自:http://hi.baidu.com/cyclone/blog/item/8f8f08fa52d22f8758ee9006.html Qt 是 C++ 的库,Qt在ansi C++ 的基础上进行了一点扩展。 但国内似乎比较浮躁,学Qt的很多连基本的C++如何编译似乎都不太清楚。本文舍弃IDE或qmake、cmake等工具的...

Qt5.3.2_CentOS6.4_基本编程环境__20160306【勿删,繁琐】

20160306 全程没有f/q ZC:使用的虚拟机环境是:博客园VMwareSkill 的 “CentOS6.4_x86_120g__20160306.rar” 1、 执行命令“gcc -v”,显示: “ [root@centos ~]# gcc -vbash: gcc: command not found[root@centos ~]# ” 说明没有...

Android:JNI与NDK(二)交叉编译与动态库,静态库

  欢迎关注公众号,第一时间获取最新文章:   本篇目录 一、前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,linux操作系统基本是同样适用的。 交叉编译就是在A平台编译出可以在B平台执行的文件,对于我们安卓开发者来说交叉编译就是在window或者mac或者...

CentOS7 添加FTP用户并设置权限

step 1 安装配置Vsftp服务器 一、配置防火墙,开启FTP服务器需要的端口 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙。 1、关闭firewall: systemctl stop firewalld.service#停止firewall systemctl disable firewalld.ser...

WPF DataGrid绑定到数据源的方法

1 string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["str"].ConnectionString; 2 SqlConnection con = new SqlConnection(conStr); 3...