Makefile

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 则只用于链接时。





g++的编译选项:-Wl,-rpath=



假设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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值