1,-D 宏定义
2,有个比较全的代码如下:
CC=gcc #编译工具
EXEC=app #目标名
SOURCE :=$(wildcard *.c) $(wildcard *.cpp) #源文件名集合
OBJS :=$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE))) #可链接目标文件集合
$(EXEC):$(OBJS)
$(CC) -o $@ $^
clean:
$(RM) $(OBJS) $(EXEC)
关键字解释:
wildcard为获取匹配模式的文件列表函数。
patsubst为匹配替换函数。
$@为目标文件名
$^所有依赖的文件列表
3,-Wl,-rpath
gcc的-L选项和-Wl,-rpath,的区别是什么?
http://bbs.chinaunix.net/thread-1786166-1-1.html
GCC链接选项-L,-rpath-link和-rpath
http://blog.csdn.net/openme_openwrt/article/details/7860580
OpenWrt中编译qtopia和qte2是会找不到uuid的库,需要特别地使用-luuid来指定,即使用-L$(dir) -luuid。
然而如果使用-Wl,-rpath-link=$(dir)选项,则会自动搜索libuuid.so进行链接。
GCC里的链接器的选项是 -rpath 和 -rpath-link,看了下 man ld,大致是这个意思:
-L: “链接”的时候,去找的目录,也就是所有的 -lFOO 选项里的库,都会先从 -L 指定的目录去找,然后是默认的地方。
-rpath_link (或者 -rpath-link):这个也是用于“链接”的时候的,例如你显示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,后者你并没有指定,而是 FOO.so 引用到它,这个时候,会先从 -rpath-link 给的路径里找。
-rpath: “运行”的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找。对于交叉编译,只有配合 --sysroot 选项才能起作用。
也就是说,-rpath指定的路径会被记录在生成的可执行程序中,用于运行时。
-rpath-link 则只用于链接时。
假设main.cpp,hello.h,hello.cpp,其中main.cpp调用了hello类中的方法
1 生成hello.so
g++ -shared hello.cpp -olibhello.so
2 编译main.cpp,并链接,并指定运行时libhello.so的位置
g++ main.cpp -lhello -L./ -Wl,-rpath=./ -o main
值得一提的是,如果采用带版本号的库,例如libhello.so.2
链接命令可使用g++ main.cpp libhello.so.2 -L./ -Wl,-rpath=./ -o main
2)加入第二个so库
g++ main.cpp -L./second/ -Wl,-rpath=./second/ -lsecond -L./hello/ -Wl,-rpath=./hello/ -lhello -o main
ps,遇到过一个奇怪的问题,就是假设libhello.so还用到了libother.so,由于在/etc/ld.so.conf里配置错误了libother.so的目录路径,导致一直产生undefined reference to错误,但是在工程里对libother目录路径配置是正确的,有可能于查找路径顺序有关
http://www.cnblogs.com/maximusfz/archive/2010/12/01/1893384.html