初学Makefile,权当是笔记,希望对别人有些帮助吧。
------------------------------------------------------------------------------------
本次例子目录结构如下:
目录说明:
lib目录是我自己写的一个so库文件,名为libA.so,很简单,里面的内容截图如下:
-------------------------------------------------------------------------------------------------------------
main目录是测试程序所在目录,用于测试libA.so,里面的内容截图如下:
---------------------------------------------------------------------------------------------------------------------
release目录用于存放编译后的so库文件和编译后的测试程序,截图如下:
-----------------------------------------------------------------------------------------------------------------------
因为main.out用于测试libA.so,所以编译时我们必须先编译libA.so,
libA.so的Makefile内容如下:
exe=../release/libA.so
### 链接目标文件
$(exe):libA.o
gcc -o $(exe) -lstdc++ -fPIC -shared -Xlinker libA.o
### 编译源文件
libA.o:libA.cpp
gcc -lstdc++ -c libA.cpp
clean:
-rm *.out *.o *.bak
---------------------------------------------------------------------------------------------------------------------------------------
libA.cpp内容如下:
#include <stdio.h>
void ShowHello()
{
printf("hello libA \n");
}
----------------------------------------------------------------------------------------
main.cpp的Makefile内容如下:
exe=../release/main.out
### 链接目标文件
### -L ../release 用于指定libA.so所在目录
### -lA 链接库文件libA.so
$(exe):main.o
gcc -o $(exe) -lstdc++ -Xlinker main.o -L ../release -lA
### 编译源文件
main.o:main.cpp
gcc -lstdc++ -c main.cpp
clean:
-rm *.out *.o *.bak
--------------------------------------------------------------------------------------------------------------
main.cpp内容如下:
#include<stdio.h>
extern void ShowHello();
int main(void)
{
ShowHello();
return 0;
}
--------------------------------------------------------------------------------
编译好libA.cpp和main.cpp,跳到release运行main.out,效果如下:
-----------------------------------------------------------------------------------------------------------------------------------------------------
题外话:
运行程序如果提示找不到xxx.so,
敲以下命令即可:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH // 把当前目录加入到库文件搜索目录环境变量
我当时的错误提示如下:
./main.out
./main.out: error while loading shared libraries: libA.so: cannot open shared object file: No such file or directory