linux - 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" 确实按预期工作
解决方案
推荐阅读
- ios - 我无法从 Firestore 获取特定数据
- php - 将 MySQL 数据转换为 JSON 对象以用于分层显示(使用 D3JS)
- asp.net-core - 无法从主题交换rabbitmq消费队列
- woocommerce - 使用 WP_Query/Essential Grid 显示 woocommerce 相关产品
- php - PHPMailer中的SMTP使用
- python - 如何使用 plotly 或任何其他方法将 seaborn 散点图转换为交互式散点图?
- django - django-autocomplete-light 模板不呈现自动完成小部件
- python - tkinter 输入框在单击按钮之前更新
- python - 识别包含单词的句子,并使用 str.contains 在列中显示该单词
- powerbi - Power bi 数据集