1

对于使用 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

知道有什么问题吗?

PS - 我知道 -c 标志参与其中,但删除它会导致其他问题。

4

1 回答 1

2

我在编译/链接期间得到以下输出

不,你没有。您在编译期间收到此警告,它准确地告诉您问题所在:您在命令行上传递-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)
于 2013-01-10T06:50:45.680 回答