嵌入式開發學習(7)<編譯神器之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

微妙之處,請自行體會。

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com