1.如果编译时指定了-L选项,就优先到-L指定的路径去查找库进行连接;
2.查找GCC的环境变量LIBRARY_PATH
3.到/bin /usr/lib /usr/local/lib去查找。这几个搜索路径在gcc下是默认的。
所以当我们要让自己添加的库文件让gcc能搜索到,有两种方法,一种就是用-L指定,一种就是将库复制到以上几个gcc默认搜索路径。
二、run-time库搜索路径
1.编译时用-Wl, -rpath指定的路径
Ex:
arm-none-linux-gnueabi-gcc -o helloword_arm helloword.c -Wl,-dynamic-linker=/system/lib/ld-linux.so.3,-rpath,/system/lib/
2.环境变量LD_LIBRARY_PATH指定的路径
3./etc/ld.so.conf指定的路径
4.默认的动态搜索库路径/lib /usr/lib
LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下:
LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):
export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH
LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):
export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH
举个例子,我们开发一个程序,经常会需要使用某个或某些动态链接库,为了保证程序的可移植性,可以先将这些编译好的动态链接库放在自己指定的目录下,然后按照上述方式将这些目录加入到LD_LIBRARY_PATH环境变量中,这样自己的程序就可以动态链接后加载库文件运行了。
区别与使用:
开发时,设置LIBRARY_PATH,以便gcc能够找到编译时需要的动态链接库。
发布时,设置LD_LIBRARY_PATH,以便程序加载运行时能够自动找到需要的动态链接库。
三、几个重要的命令
1)ldd bin_name
可以查看编译出来的可执行文件依赖的库。部署程序时,我们要把这些库拷贝出来,然后将这些库连同可执行文件拷贝到新的机器上,在/etc/ld.so.conf.d下添加对应的库文件搜索路径即可。
2.ldconfig命令
搜索/lib和/usr/lib以及/etc/ld.so.conf下列出来的所有路径的库,然后创建动态库的cache文件。当程序需要搜索库时就会搜索ld.so.cache里列出来的库。
所以当我们向系统添加新的库文件时,除了需要把库文件烤到/usr/local/lib等指定位置外,还需ldconfig一下来更新cache文件。
四、gcc头文件的搜索路径
1.优先搜索-I指定的路径
2.查找GCC的环境变量C_INCLUDE_PATH/CPLUS_INCLUDE_PATH/OBJC_INCLUDE_PATH指定的路径
3.查找默认的搜索路径/usr/include /usr/local/include
所有GCC的环境变量,我们都可以GCC的原有搜索路径上上面添加进我们自己的路径,例如
#增加.so搜索路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home//lib
#增加.a搜索路径
LIBRARY_PATH=$LIBRARY_PATH:/home/lib
#增加bin搜索路径
export PATH=$PATH:/home/bin
#增加GCC的include文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/home/include
-wall -pedantic
-wall编译时显示所有的警告信息,可以增加程序的健壮性和可移植性
-pedantic,以符合ANSI/ISO C 标准列出所有警告
如:grep “time_t” /usr/include/*.h |grep “typedef”可以查找到“typedef_time_t time_t”Locatekeyword.h 可以查找名为keyword 的头文件所在地目录树
使用linux系统难免会忘记文件所在的位置,可以使用以下命令对系统中的文件进行搜索。搜索文件的命令为”find“;”locate“;”whereis“;”which“;”type“
linux下最强大的搜索命令为”find“。它的格式为”find <指定目录><指定条件><指定动作>“;比如使用find命令搜索在根目录下的所有interfaces文件所在位置,命令格式为”find / -name 'interfaces'“
使用locate搜索linux系统中的文件,它比find命令快。因为它查询的是数据库(/var/lib/locatedb),数据库包含本地所有的文件信息。使用locate命令在根目录下搜索interfaces文件的命令为”locate interfaces“
使用”whereis“命令可以搜索linux系统中的所有可执行文件即二进制文件。使用whereis命令搜索grep二进制文件的命令为”whereis grep“。
使用which命令查看系统命令是否存在,并返回系统命令所在的位置。使用which命令查看grep命令是否存在以及存在的目录的命令为”which grep“
使用type命令查看系统中的某个命令是否为系统自带的命令。使用type命令查看cd命令是否为系统自带的命令;查看grep 是否为系统自带的命令。
首先,必须调用FindFirstFile函数来打开一个搜索句柄和获得在文件夹中的文件系统中的第一个文件的信息。之后,必须调用FindNextFile函数在调用FindFirstFile之后列出接下来所有的文件。
例子:
WIN32_FIND_DATA FindFileData
HANDLE hFind
TCHAR *FilePathBuff = L"C:\\TestFolder"
hFind = FindFirstFile(FilePathBuff, &FindFileData)
if (hFind == INVALID_HANDLE_VALUE)
{
_tprintf(TEXT("FindFirstFile failed (%d)\n"), GetLastError())
}
else
{
_tprintf(TEXT("The first file is %s\n"), FindFileData.cFileName)
while (FindNextFile(hFind, &FindFileData) != 0)
{
_tprintf(TEXT("The next file is %s\n"),
FindFileData.cFileName)
}
FindClose(hFind)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)