首页 > 解决方案 > makefile 包括路径层次结构和库位置?

问题描述

我有一个标准安装的 debian 开发包,其中包含一个包含文件,例如

/usr/include/abcd.h

但是我有一个从源代码编译的更新包,其中包含文件,例如

/home/user01/include/abcd.h

我如何获得命令行 gcc 或在 make 文件中确保它选择后者?

如果我添加任何一个

gcc -I /home/user01/include 

或在 make 文件中将包含行更改为

INCLUDES = -I /home/user01/include 

似乎总是先使用 /usr/include 中的那个?

我试图保持简单,但根据@MadScientist 的要求,这里有更多实际的细节。

以下构建,没有警告或错误,但运行结果表明它使用的是旧的基于 repo 的 mdbtools 版本,而不是我从该运行中的源代码和实用程序编译的版本,如预期的修复。(在 Debian 11 上)

gcc -g -O2 -DSQL -Wall -Werror -DUNIXODBC -o myTestMdb main.c -I /media/sdd02/src/mdbtools-deb11/include/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gtk-2.0 -I/usr/include/cairo/ -I /usr/include/pango-1.0/ -I /usr/lib/x86_64-linux-gnu/gtk-2.0/include/ -I /usr/include/gdk-pixbuf-2.0/ -I /usr/include/atk-1.0/ -lmdb -lglib-2.0 -lmdbsql -DHAVE_GLIB

如果我尝试(按照建议添加 -nostdinc)

gcc -g -O2 -DSQL -Wall -Werror -DUNIXODBC -o myTestMdb main.c -nostdinc -I /media/sdd02/src/mdbtools-deb11/include/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gtk-2.0 -I/usr/include/cairo/ -I /usr/include/pango-1.0/ -I /usr/lib/x86_64-linux-gnu/gtk-2.0/include/ -I /usr/include/gdk-pixbuf-2.0/ -I /usr/include/atk-1.0/ -lmdb -lglib-2.0 -lmdbsql -DHAVE_GLIB

我明白了

main.c:20:10: fatal error: string.h: No such file or directory

20 | #include <string.h>

如果我尝试

gcc -g -O2 -DSQL -Wall -Werror -DUNIXODBC -o myTestMdb main.c -nostdinc -I /media/sdd02/src/mdbtools-deb11/include/ -I /usr/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gtk-2.0 -I/usr/include/cairo/ -I /usr/include/pango-1.0/ -I /usr/lib/x86_64-linux-gnu/gtk-2.0/include/ -I /usr/include/gdk-pixbuf-2.0/ -I /usr/include/atk-1.0/ -lmdb -lglib-2.0 -lmdbsql -DHAVE_GLIB

我明白了

/usr/include/string.h:26:10: fatal error: bits/libc-header-start.h: No such file or directory

26 | #include <bits/libc-header-start.h>

同样,如果我尝试在 makdefile 中使用 make 和 have

INCLUDES = -I /media/sdd02/src/mdbtools-deb11/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gtk-2.0 -I/usr/include/cairo/ -I /usr/include/pango-1.0/ -I /usr/lib/x86_64-linux-gnu/gtk-2.0/include/ -I /usr/include/gdk-pixbuf-2.0/ -I /usr/include/atk-1.0/ -I /media/sdd02/src/mdbtools/include/ -I /media/sdd02/src/mdbtools/include/

我明白了

/usr/include/mdbtools.h:37:10: fatal error: mdbfakeglib.h: No such file or directory

37 | #include <mdbfakeglib.h>

注意 /usr/include/mdbtools.h 不是所需的 /media/sdd02/src/mdbtools-deb11/include/mdbtools.h 我已经检查了头文件确实存在的文件夹

因此,根据@GM 的建议,我将 -H -P 添加到构建中,这表明它正在使用 mdbtools.h (以及其他与 mdb 相关的 .h 文件)。所以 /usr/include/mdbtools.h 是特定于 makefile 问题的。暂时离开。

所以现在我认为它与 lib 相关我只使用 -lmdb -lmdbsql 如果我执行 whereis 我得到 /usr/lib 条目。如何让它使用我尝试过的不同位置?

-L /media/sdd02/src/mdbtools-deb11/src/sql/ -L /media/sdd02/src/mdbtools-deb11/src/libmdb/ -lmdb -lmdbsql 

或者

-L /media/sdd02/src/mdbtools-deb11/src/sql/.libs -L /media/sdd02/src/mdbtools-deb11/src/libmdb/.libs -lmdb -lmdbsql 

但它似乎仍然会使用我得到的输出中基于 /usr 的那些。

根据@GM 尝试添加 -Wl -verbose 但得到了

gcc: error: unrecognized command-line option ‘-Wl’; did you mean ‘-W’?

gcc: error: unrecognized command-line option ‘-verbose’; did you mean ‘--verbose’?

供参考 gcc 版本是

gcc (Debian 10.2.1-6) 10.2.1 20210110

我用 --verbose 重新运行,但我没有看到任何关于它从 -lmdbsql 参数中寻找 mdbsql 或 libmdbsql.so 的更详细信息,我希望应该使用 -L/media/sdd02/src/mdbtools-deb11/ src/sql/.libs/ 它确实存在,但我怀疑从构建程序的输出。

仍然有与 makefile 相关的问题需要调查,但命令行问题是我对共享库和静态库的困惑。我尝试了“LD_LIBRARY_PATH=/media/sdd02/src/mdbtools-deb11/src/sql/.libs/:...etc”,但没有成功,但“导出 LD_LIBRARY_PATH=”/media/sdd02/src/mdbtools- deb11/src/sql/.libs/: ... etc" 确实按预期工作

标签: linuxgccmakefile

解决方案


推荐阅读