我有一个使用 gsl 的程序的以下 Makefile:
CXX = g++
ARCH = -mtune=generic
COFLAGS = $(ARCH) -O3 -pipe -I./gsl
CXXFLAGS = -Wall $(COFLAGS)
PROGRAMS = myProgram
GSLFLAGS= -L./gsl/.libs -lgsl -L./gsl/cblas/.libs -lgslcblas -lm
all: $(PROGRAMS)
myProgram: myProgram.cpp common.o
$(CXX) $(CXXFLAGS) $(GSLFLAGS) myProgram.cpp common.o -o myProgram
common.o: common.cpp common.h
common.o: common.h common.cpp
$(CXX) $(CXXFLAGS) $(BOOSTFLAGS) $(GSLFLAGS) -c common.cpp
我在编译/链接期间得到以下输出:
g++: -lgsl: linker input file unused because linking not done
知道出了什么问题吗?
附注- 我知道其中涉及 -c 标志,但删除它会导致其他问题。
我在编译/链接期间得到以下输出
不,你不知道。您在编译期间收到此警告,它会告诉您确切地问题是什么:您在命令行上一起传递
-lgsl
和-c
,并且当您不进行链接时,
-lgsl
将被忽略(这就是 -c
要求 g++
做的事情)。
现在,您的
Makefile
在任何地方都没有单独的 -c
,因此您很可能没有剪切/粘贴整个 Makefile
,并且完全省略了此处相关的详细信息。
更新:这是你不想要的行
$(GSLFLAGS)
:
$(CXX) $(CXXFLAGS) $(BOOSTFLAGS) $(GSLFLAGS) -c common.cpp
最后,这个链接线:
$(CXX) $(CXXFLAGS) $(GSLFLAGS) myProgram.cpp common.o -o myProgram
错误:命令行上源/对象和库的顺序很重要。正确的链接线应该是:
$(CXX) $(CXXFLAGS) myProgram.cpp common.o -o myProgram $(GSLFLAGS)