user-0 提问: 关于gcc的几个问题

回复:
user: user-1
content: 你可以简单地理解为gcc搜索路径程序代码类似如下实现 if(getOpt(“I”)!=NULL) {//1 查找-I参数     //如果有-I参数，则搜索-I参数的路径 } if(getEnv(“xxx”) !=NULL) {//2 查找环境变量     //如果有设定相应的环境变量，则搜索环境变量指定的路径 } if(getRelativePath(argv[0])!=NULL) {//3 查找gcc安装路径的include相对路径     //如果找到相对路径，则搜索相对路径 } 这样你应该能理解gcc是怎么能找到include路径了吧？

user: user-2
content: 写成 makefile,cmakelist之类的不就完了

user: user-1
content: 同样的，链接库也在gcc安装路径的相对路径的lib里，如gcc安装在C:\\MinGW\bin，lib就是C:\\MinGW\lib，怎么通过相对路径找的，前面一贴有说名

user: user-1
content: 不是不明白你问什么，而是你没理解我回答的内容 gcc会自动搜索include和lib路径，这是在gcc内部实现的，它会以上述说的123的顺序搜索路径。 1和2没有，为什么会搜索3？怎么搜索3，这不是很简单吗？gcc先取到自己安装的路径，比如安装在C:\\MinGW\bin，gcc找到这个路径后用相对路径的方式找include，即C:\\MinGW\include，从C:\\MinGW\bin到C:\\MinGW\include怎么用相对路径查找会吧？C:\\MinGW\bin\.. 就能找到C:\\MinGW（父文件夹），再父文件夹\include，即C:\\MinGW\bin\..\include就能找到include路径了。怎么找到gcc安装路径？一个程序找到自己的路径难吗？main函数有个argv[0]参数，bat的话可以通过%~dp0参数获取。 所以，你只要知道gcc安装在哪，你就知道它默认的搜索路径，那么这些头文件都在这个include路径下，gcc不就能找到了吗？这还有什么不明白的？

user: user-0
content: 引用 6 楼 qybao 的回复: 唉，算了老哥，你一直没明白我在讲什么。我还是找找相关书籍吧

user: user-1
content: 引用 5 楼 六道佩恩 的回复：[quote=引用 4 楼 qybao 的回复:] 你都没仔细看吧？不是告诉你搜索路径的顺序了吗，你不用makefile，就用环境变量好了呀 inlcude环境变量C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH link环境变量LIBRARY_PATH（编译时），LD_LIBRARY_PATH（运行时） 定义环境变量不会吗？不会的话自己谷歌百度搜索怎么定义环境变量 https://blog.csdn.net/Flood_Dragon/article/details/12363705  老哥。。。这。。。  我不是在问它的搜索路径有哪些，要看搜索路径我给gcc加个参数输出来不就行了吗？  你说的这些环境变量，包括你的这个链接，关键是，现在并没有这些环境变量，它也一样正常工作的，也依然能找到库的位置，这是我所疑惑的，我是想知道，这个记录该路径的的字符串在哪里？既然环境变量没有，那么它在哪里？我搜索过整个mingw里的文本内容，没有这些路径，所以我在怀疑它是不是写在gcc或ld程序里面的？  第二个，也是最重要的问题，gcc是根据什么找到对应的库的，比如我包含math.h，或调用数学函数，gcc怎么知道需要的库是哪一个？为什么有的库，文件夹里明明就有，它却又找不到，需要我们自己用参数来链接？  [/quote]你还是没仔细看，不在makefile，不在环境变量里，那就是上面说的第三种情况，在gcc的安装路径的相对路径里

user: user-0
content: 引用 4 楼 qybao 的回复:你都没仔细看吧？不是告诉你搜索路径的顺序了吗，你不用makefile，就用环境变量好了呀 inlcude环境变量C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH link环境变量LIBRARY_PATH（编译时），LD_LIBRARY_PATH（运行时） 定义环境变量不会吗？不会的话自己谷歌百度搜索怎么定义环境变量 https://blog.csdn.net/Flood_Dragon/article/details/12363705  老哥。。。这。。。  我不是在问它的搜索路径有哪些，要看搜索路径我给gcc加个参数输出来不就行了吗？  你说的这些环境变量，包括你的这个链接，关键是，现在并没有这些环境变量，它也一样正常工作的，也依然能找到库的位置，这是我所疑惑的，我是想知道，这个记录该路径的的字符串在哪里？既然环境变量没有，那么它在哪里？我搜索过整个mingw里的文本内容，没有这些路径，所以我在怀疑它是不是写在gcc或ld程序里面的？  第二个，也是最重要的问题，gcc是根据什么找到对应的库的，比如我包含math.h，或调用数学函数，gcc怎么知道需要的库是哪一个？为什么有的库，文件夹里明明就有，它却又找不到，需要我们自己用参数来链接？

user: user-3
content: 引用 楼主 六道佩恩的回复:1. 关于gcc搜索头文件和静态库的目录，虽然可以在编译时加参数修改，但是能永久修改吗？让以后不必再用参数指定目录那种。 2. gcc是根据什么找到头文件对应的静态库文件的？为什么即便在同一目录下，有的库gcc就能自动链接，有的则需要我们指定？ 使用makefile

user: user-1
content: 头文件搜索 头文件搜索顺序： 1.由参数-I指定的路径(指定路径有多个路径时，按指定路径的顺序搜索) 2.然后找gcc的环境变量 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH 3.再找内定目录 /usr/include /usr/local/include /usr/lib/gcc-lib/i386-linux/2.95.2/include /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3 /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include  如果你没指定1，那就从2开始找，如果2也没指定，就从3开始找，其中/usr/include是相对于gcc的，因为一般gcc安装在/usr/bin/gcc，所以/usr/include就是默认搜索路径  链接库搜索路径 1.编译目标代码时指定的动态库搜索路径； 2.环境变量LIBRARY_PATH（编译时），LD_LIBRARY_PATH（运行时）指定的动态库搜索路径； 3.配置文件/etc/ld.so.conf中指定的动态库搜索路径； 4.默认的动态库搜索路径/lib； 5.默认的动态库搜索路径/usr/lib。

user: user-1
content: 引用 3 楼 六道佩恩 的回复:关键是这些路径是写在哪里的？总不可能是写在gcc里面的吧？而且我的环境是mingw，不是linux。  我编译的时候是指定gcc命令行编译，没有使用makefile，所以，对于那些能自动找到目标库的，比如标准库、win32库，它怎么知道哪个对应哪个？ 你都没仔细看吧？不是告诉你搜索路径的顺序了吗，你不用makefile，就用环境变量好了呀 inlcude环境变量C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH link环境变量LIBRARY_PATH（编译时），LD_LIBRARY_PATH（运行时） 定义环境变量不会吗？不会的话自己谷歌百度搜索怎么定义环境变量 https://blog.csdn.net/Flood_Dragon/article/details/12363705

user: user-0
content: 引用 1 楼 qybao 的回复:头文件搜索 头文件搜索顺序： 1.由参数-I指定的路径(指定路径有多个路径时，按指定路径的顺序搜索) 2.然后找gcc的环境变量 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH 3.再找内定目录 /usr/include /usr/local/include /usr/lib/gcc-lib/i386-linux/2.95.2/include /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3 /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include  如果你没指定1，那就从2开始找，如果2也没指定，就从3开始找，其中/usr/include是相对于gcc的，因为一般gcc安装在/usr/bin/gcc，所以/usr/include就是默认搜索路径  链接库搜索路径 1.编译目标代码时指定的动态库搜索路径； 2.环境变量LIBRARY_PATH（编译时），LD_LIBRARY_PATH（运行时）指定的动态库搜索路径； 3.配置文件/etc/ld.so.conf中指定的动态库搜索路径； 4.默认的动态库搜索路径/lib； 5.默认的动态库搜索路径/usr/lib。 关键是这些路径是写在哪里的？总不可能是写在gcc里面的吧？而且我的环境是mingw，不是linux。  我编译的时候是指定gcc命令行编译，没有使用makefile，所以，对于那些能自动找到目标库的，比如标准库、win32库，它怎么知道哪个对应哪个？