zoukankan      html  css  js  c++  java
  • gcc链接g++编译生成的静态库和动态库的makefile示例

    使用c++开发程序或者库时,将库提供给其他人使用。

    然而使用者是使用c开发的程序,链接g++编译生成的库时,于链接gcc生成的库,有所不同。

    首先是静态库,以链接g++编译生成的libmylib.a为例子

    mylib依赖于pthread,rt,math库,链接时必须放在mylib之后。

    同时-Wl,--no-as-needed -ldl添加在末尾是必须的。

    arm和x86有些不同,就是arm的gcc不会自动链接数学库math,需要手动添加链接。

     1 CC=arm-linux-gnueabihf-gcc -std=c99
     2 CCLDFLAGS= -L. -lmylib -lstdc++ -pthread -lrt -lm -Wl,--no-as-needed -ldl
     3 #CC=gcc -m32 -std=c99
     4 #CCLDFLAGS=-L. -lmylib -lstdc++ -pthread -lrt -Wl,--no-as-needed -ldl
     5 
     6 all:test
     7 
     8 test.o:test.c
     9     $(CC) -I../inc/ test.c -c -o test.o
    10 
    11 test:test.o libmylib.a
    12     $(CC) test.o -o test $(CCLDFLAGS)
    13 
    14 .PHONY: clean
    15 
    16 clean:
    17     -rm test test.o -f

    gcc链接g++生成的动态库示例:

    libmylib.so库,使用g++编译时,静态链接了stdc++库(-static-libstdc++)。

     1 CC=gcc -m32 -std=c99
     2 #CC=arm-linux-gnueabihf-gcc -std=c99
     3 CCLDFLAGS=-lstdc++ -L. -lmylib
     4 
     5 Root:root
     6 
     7 root.o:test.c
     8     $(CC) -I../inc/ test.c -c -o root.o
     9     
    10 root:root.o libmylib.so
    11     $(CC) root.o -o root $(CCLDFLAGS)
    12 
    13 
    14 .PHONY: clean
    15 
    16 clean:
    17     -rm root *.o
  • 相关阅读:
    帮助理解Docker,生动装逼介绍Docker
    Java 最常见 200+ 面试题 + 全解析
    CentOS7.0 yum安装 docker
    集合总结
    C#复习笔记
    match方法的使用
    偏函数
    通用装饰器
    装饰器修饰带参数的功能函数
    多个装饰器的使用
  • 原文地址:https://www.cnblogs.com/jojodru/p/3992463.html
Copyright © 2011-2022 走看看