C++静态库与动态库

最后发布时间:2020-07-22 16:40:06 浏览量:

图片alt

图片alt

图片alt

图片alt

  • 在Windows系统下的执行文件格式是PE格式,动态库需要一个DllMain函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字。

  • Linux下gcc编译的执行文件默认是ELF格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。

  • 对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的 DT_RPATH段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/usr/lib 目录找到库文件后将其载入内存。

https://www.cnblogs.com/king-lps/p/7757919.html

GDB 调试

  1. gcc main.c -g

  2. gdb a.out

  3. gdb

    图片alt

    图片alt

  4. run 运行程序

  5. break设置断点

    图片alt

    图片alt

项目管理工具

autoconf、automake
Linux工具之autogen.sh`

makefile基础配置

main:main.o printMap.o
        g++ main.o printMap.o -o main
main.o:main.cpp
        g++ -c main.cpp -o main.o
printMap.o:printMap.cpp
        g++ -c printMap.cpp -o printMap.o
clean:
        rm *.o main

在目录中的源文件

.
├── foo
│   └── foo.cpp
├── foo.o
├── main
├── main.cpp
├── main.o
├── Makefile
├── printMap.cpp
└── printMap.o

.PHONY:clean
cc = g++
main:main.o printMap.o foo.o
        $(cc) main.o printMap.o foo.o -o main
main.o:main.cpp
        $(cc) -c main.cpp -o main.o
printMap.o:printMap.cpp
        $(cc) -c printMap.cpp -o printMap.o
foo.o:foo/foo.cpp
        $(cc) -c foo/foo.cpp -o foo.o
clean:
        rm *.o main

通过多个makefile文件

.PHONY:clean
cc = g++
main:main.o printMap.o foo.o
$(cc) main.o printMap.o foo/foo.o -o main
main.o:main.cpp
$(cc) -c main.cpp -o main.o
printMap.o:printMap.cpp
$(cc) -c printMap.cpp -o printMap.o
#foo.o:foo/foo.cpp
#       $(cc) -c foo/foo.cpp -o foo.o
foo.o:
cd foo;make
clean:
rm *.o main

库文件

https://www.jianshu.com/p/96c114eb4417
https://github.com/maxrd2/SubtitleComposer/wiki/Building-from-sources