Automake生成Makefile引发构建警告,如何解决?
解决g++编译警告:linker input file unused because linking not done
问题背景
子项目的Makefile.am内容如下:
## Process this file with automake to produce Makefile.in lib_LTLIBRARIES = \ libodbc_lib.la libodbc_lib_la_SOURCES = \ database_odbc.cpp \ database_odbc.h libodbc_lib_la_CXXFLAGS = -I../../dbinterface \ -DUNICODE \ -DUNIXODBC \ `odbc_config \ --include-prefix` libodbc_lib_la_LDFLAGS = -L../dbinterface \ -ldbinterface \ `odbc_config \ --libs`
生成的编译命令中出现如下警告:
libtool: compile: g++ -DHAVE_CONFIG_H -I. -I/home/igor/dbhandler/libodbc -I.. -I../../dbinterface -DUNICODE -DUNIXODBC /usr/include -g -O0 -MT libodbc_lib_la-database_odbc.lo -MD -MP -MF .deps/libodbc_lib_la-database_odbc.Tpo -c /home/igor/dbhandler/libodbc/database_odbc.cpp -fPIC -DPIC -o .libs/libodbc_lib_la-database_odbc.o g++: warning: /usr/include: linker input file unused because linking not done
警告原因
你误解了警告的根源:-c选项是编译阶段的必需参数,它告诉g++只编译源文件,不执行链接操作,本身没有问题。
真正的问题是odbc_config --include-prefix的输出是/usr/include这个路径本身,而不是编译选项需要的-I/usr/include。在编译阶段(带-c),g++会把裸路径当成链接输入文件,但此时不做链接,所以抛出这个警告。
解决方法
修改Makefile.am中libodbc_lib_la_CXXFLAGS的配置,给odbc_config --include-prefix的输出加上-I前缀,让它成为合法的编译包含路径选项:
libodbc_lib_la_CXXFLAGS = -I../../dbinterface \ -DUNICODE \ -DUNIXODBC \ -I`odbc_config --include-prefix`
或者使用Automake支持的Make函数语法(更规范):
libodbc_lib_la_CXXFLAGS = -I../../dbinterface \ -DUNICODE \ -DUNIXODBC \ -I$(shell odbc_config --include-prefix)
修改后重新执行autoreconf -i、./configure和make,警告就会消失。
额外建议
- 可以检查
odbc_config的输出是否符合预期,执行odbc_config --include-prefix确认返回的是正确的头文件路径。 - 如果系统支持
pkg-config,可以考虑用pkg-config unixodbc --cflags替代odbc_config --include-prefix,这是更通用的编译选项获取方式:
对应的链接选项也可以换成libodbc_lib_la_CXXFLAGS = -I../../dbinterface \ -DUNICODE \ -DUNIXODBC \ $(shell pkg-config unixodbc --cflags)$(shell pkg-config unixodbc --libs)。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

