神器之makefile

本机环境是centos6.5 64位。

安装c编译器 :yum install gcc

安装c++编译:yum install gcc-c++

安装make工具:yum install make

上代码:

main.c

#include <stdio.h>
#include "me.h"
void main(){
    int age = getAge();
    printf("my age is %d\n",age);
}
~ 

me.c

int getAge(){
        return 18;
}

me.h

int getAge();

makefile

hello:me.c hello.c
        gcc me.c hello.c -o hello

执行 make命令,控制台就会打印出:gcc me.c hello.c -o hello 。
上面的例子贼简单,但能说明问题,如果有成千上百个.c源文件,每次都得一个一个去gcc,那会死人的,如果用make工具,就会变的so easy !

进一步,动态链接库

假设我的me.c的里的功能是一个非常牛逼的东东,我这个hello软件要卖个第三方(队友)使用,我又不想让他知道(修改)我的源代码。这时就可以用动态链接库了。

执行命令:gcc -o libme.so me.c -shared 。当前目录下多了一个libme.so文件。

我们执行gcc -o hello hello.c me.c是可以编译成功的,但这时我们想拿掉me.c源文件,用libme.so去替换,怎么做呢?

执行 gcc -L /usr/local/test/ -l me hello.c -o hello(L后面是libme.so的文件绝对路径,l后面的是名为libme.so当中的me)。

这时发现编译通过了,运行./hello时报“./hello: error while loading shared libraries: libme.so: cannot open shared object file: No such file or directory”。

执行ldd hello (探测程序hello有几个依赖文件)

输出:linux-vdso.so.1 =>  (0x00007fffe3fff000)
     libme.so => not found
     libc.so.6 => /lib64/libc.so.6 (0x0000003c18200000)
     /lib64/ld-linux-x86-64.so.2 (0x0000003c17e00000)

神马?libme.so not found?

linux跟windows一样,有个类似于system32的系统库文件夹,各种公共类库都放在里面。

centos中有两个存放公共库的地方:/lib 、/usr/lib、usr/lib64(64位才有)

执行cp libme.so /lib 和 ldconfig,再运行./hello,妥妥地执行了。

再进一步,安装软件时所用的make 、make install 之谜

修改makefile文件为:

hello:hello.c libme.so
        gcc  -L ./ -l me  hello.c -o hello
libme.so:me.c
        gcc -shared -o libme.so me.c
install:
        cp ./libme.so /lib
        ldconfig

删掉之前残留的文件:rm -rf hello libme.so /lib/libme.so。
执行:make ,控制台输出:

gcc -shared -o libme.so me.c
gcc  -L ./ -l me  hello.c -o hello

再执行make install,控制台输出:

cp ./libme.so /lib
ldconfig

还可以这样执行 make && make install (当make执行成功时,才执行make intall)。

再执行 ./hello,控制台输出:

my age is 18

微妙之处,请自行体会。

时间: 2024-10-14 10:12:38

神器之makefile的相关文章

ORACLE恢复神器之ODU/AUL/DUL

分享ORACLE数据库恢复神器之ODU.DUL和AUL工具. ODU:ORACLE DATABASE UNLOADER DUL:DATA UNLOADER AUL:也称MyDUL 关于三种工具说明: (1)Oracle 的内部工具是DUL(Data UnLoader).这个需要Oracle 的支持. (2)老熊写的ODU   网址:http://www.oracleodu.com/en/ (3)d.c.b.a (支付宝 楼方鑫)写的AUL. 网址:http://www.anysql.net/do

神器之“c#反编译工具“

1. ".net reflector"本人正在使用,下载地址 2."ILSpy"没实用过,可是听杨中科老师说挺好. 有了这个,妈妈再也不用操心我看不到别人封装好的代码了(^v^) 神器之"c#反编译工具"

python三大神器之&#39;迭代器&#39;

迭代器: 1.认识迭代器 迭代器是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 我们怎样才能判定一个对象是都是可以迭代的呢? 2.可迭代对象 list.tuple.str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,这类对象被称为可迭代对象 3. 如何判断一个对象是否是一个可迭代对象 可以使用 isinstance() 判断一个对象是否是 Iterable 对

抓包神器之tcpdump详解

当遇到掉包或丢包,网络不通了的网络故障,这时必然会听到抓包这个关键词,那什么是抓包呢? 想必大多数运维人都很熟悉windows下的抓包神器wireshark吧,虽说Linux下支持wireshare的安装,不过在Linux下有更强大的抓包神器,它就是tcpdump.用一句话来说就是"dump the traffic on a network".它支持针对网络层.协议.主机.网络或端口的过滤,提供了and/&&,or/||,not/!等逻辑语句来过滤无用的信息. 一.参数

shell编程三大神器之sed

[转]Json转换神器之Google Gson的使用

这几天,因为项目的需要,接触了Google的Gson库,发现这个东西很好用,遂记下简单的笔记,供以后参考.至于Gson是干什么的,有什么优点,请各位同学自行百度.话不多说,切入正题: 1. 下载Gson的jar包,拷贝到项目的lib文件夹中,并将其加入到buildPath中.使用maven的同学,直接在pom中加入以下依赖即可: ? 1 2 3 4 5 <dependency> <groupId>com.google.code.gson</groupId> <ar

Android图片加载神器之Fresco,基于各种使用场景的讲解

转载请标明出处:http://blog.csdn.net/android_ls/article/details/53137867 Fresco是Facebook开源Android平台上一个强大的图片加载库,也是迄今为止Android平台上最强大的图片加载库. 优点:相对于其他开源的第三方图片加载库,Fresco拥有更好的内存管理和强大的功能,基本上能满足所有的日常使用场景. 缺点:整体比较大,不过目前的版本已做了拆分,你只需要导入你使用到的功能相关的库.从代码层面来说侵入性太强,体现在要使用它需

自动化运维神器之saltstack (五)salt-ssh的应用场景

satlstack号称自动化运维的利器,那么saltstack能不能实现自身的批量部署呢?如果你也有这样的疑问,那么就更要看这篇文章了.答案当然是肯定的啦!saltstack可以利用salt-ssh来实现自身的批量部署.首先看待salt-ssh,很容易想到它是一个依赖 ssh 来进行远程命令执行的工具,这样做的好处是你不必在客户端安装minion程序,就可以实现远程命令的执行,而且salt-ssh支持salt的绝大部分功能. 既然不安装minion端,那么master怎样识别到客户端并与客户端进

shell编程三大神器之awk