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

0 0
原创粉丝点击