gcc/g++编译
来源:互联网 发布:国外足球数据分析软件 编辑:程序博客网 时间:2024/05/22 20:29
1. gcc/g++ -H
能够看到头文件include的过程
2. include了头文件,但发现还是引用不了头文件中的变量/函数,可以在头文件加入编译不了的字符,确认头文件内容是否被引入
头文件中的内容用可能被宏过滤了,或者头文件在多个搜索路径下有多个版本
3. 头文件搜索过程,参考链接:http://blog.csdn.net/crylearner/article/details/17013187
4. 搜索动态库so,参考链接:http://blog.csdn.net/u011173559/article/details/12067141
5. 自己编译源代码
头文件安装位置:
/usr/local/include/
动态库安装位置:
/usr/local/lib/
6. 共享库运行时,如何查找so
a. ldconfig可以改变编译器gcc/g++ -lxxx选项的寻找动态库的路径
配置文件夹在/etc/ld.so.conf.d/
动态库都需要在类似于Makefile中指定,然后编译器根据动态库路径去寻找
b. 可以将so放到自定义的路径下,
然后在/etc/ld.so.conf中加入该路径;
最后运行ldconfig,该目录下的so就可以被-lxxx选项找到了
c. -l等指定文件名的只能手动设置,-L和-I等指定目录的可以用环境变量设置
d. 如果一个路径/usr/local/xxx/lib已经在ld.so.conf中,往该路径下加入一个新的so,那么需要再次执行ldconfig,生存cache,不然运行时仍然找不到这个so
说明允许时,查找so是到/etc/ld.so.cache中找的。/etc/ld.so.cache是由ldconfig和指定路径下的so生成的。
f. gcc连接和运行时,查找动态库的路径是有区别的,见这篇文章:https://typecodes.com/cseries/gcclderrlibrarypath.html
6a. 编译连接时,查找so的路径
a. gcc -Lxxx/xxx
b. gcc link时使用LIBRARY_PATH来寻找so,优先级低于-L
c. -l后面的库名需要手动添加,可以生成的命令:pkg-config --libs xxx,其中xxx为PKG_CONFIG_PATH中的路径下的pkgconfig/xxx.pc文件的base name
7. ndk Android.mk
引用第三方so时,参考链接:http://www.cnblogs.com/satng/archive/2012/06/04/2534934.html
使用LOCAL_EXPORT_C_INCLUDES的作用,对用户代码来说,其实就是指定预编译so时,同时指出头文件位置
不使用这个变量,直接在用户代码段指定也可以,只不过聚合性不强罢了。
注意:LOCAL_EXPORT_C_INCLUDES的值一定要使用$(LOCAL_PATH)的相对位置。
8.
a. ./cofigure --prefix=/usr/local/xxx
xxx为软件名,比如编译的是vim,那么xxx就是vim
b. 开源软件Makefile的生成方式一般两种AutoMake、Cmake
AutoMake用./configure配置生成Makefile了,然后make
Cmake,通过Cmake .来生成Makefile
9. Android.mk
a. LOCAL_STATIC_LIBRARIES := liba libb libc
b. 引用的静态库会进行编译,由右向左,最先编译libc,生成的文件名为libc.a, 最后生成liba.a
c. LOCAL_SHARED_LIBRARIES := a 引用的动态库会引起编译, 动态库的完整名为liba.so
d. LOCAL_LDLIBS引用的动态库不会引起编译
e. 引用第三方动态库可以配合LOCAL_SHARED_LIBRARIES和PREBUILT_SHARED_LIBRARY使用,
LOCAL_SHARED_LIBRARIES := xxx 注意:xxx为PREBUILT_SHARED_LIBRARY中LOCAL_MODULE字段的全部
f. gcc使用-l选项或者Android.mk的LOCAL_LDLIBS的时候,动态库在库路径里面就存在这个so就可以;使用android的LOCAL_SHARED_LIBRARIES编译时,需要编译系统可以编译这个so的源代码
比如android(交叉)编译-llog,路径就是platforms/android-12/arch-arm/usr/lib/liblog.so
10. 编译开源代码后,最后关于链接和运行时的说明
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
11. gcc后面的参数,对应到Makefile中的变量CFLAGS
- gcc/g++编译
- gcc/g++编译
- GCC/G++编译实例
- gcc/g++编译
- gcc/g++ 编译
- gcc/g++编译
- 编译 - gcc/g++ 使用
- gcc/g++编译
- gcc/g++编译
- gcc/g++编译参数
- gcc/g++编译
- gcc/g++编译
- gcc/g++编译
- gcc/g++编译优化
- gcc g++编译选项
- gcc/g++编译
- gcc g++编译选项
- gcc/g++编译
- 数据库学习笔记和小练习(4)中文乱码
- 一次工位调整导致的无法上网
- swift中UIScrollView的使用(图片缩放)
- VM12安装Mac OS X 10.11
- java中变量、对象的存储位置
- gcc/g++编译
- C语言再学习 -- 负数
- 各种函数
- 微信小程序开放公测
- Android固定宽度文字自适应大小
- unix环境高级编程--进程环境与进程控制
- MySql学习存储过程遇到的问题
- 关于刷机的一些感悟
- leetCode练习(124)