2013-01-10 94 views
1

我有以下的Makefile使用GSL程序:编译/链接GSL

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 

任何想法有什么不对?

P.S. - 我知道-c标志涉及到它,但删除它会导致其他问题。

+0

“我知道-c标志参与其中,但删除它会导致其他问题。” - 当然是的。您应该删除'$(GSLFLAGS)'。 –

回答

2

我在编译过程中得到以下输出/联

不,你不知道。你是否会在编译这个警告,它会告诉你正是的问题是什么:你逝去-lgsl-c一起在命令行,当你做链接(这是什么-c要求-lgsl被忽略g++要做)。

现在,您的Makefile在任何地方都没有单独的-c,所以很可能您没有剪切/粘贴您的整个Makefile,并且完全忽略了与此处相关的详细信息。

更新:这就是你不想$(GSLFLAGS)行:

$(CXX) $(CXXFLAGS) $(BOOSTFLAGS) $(GSLFLAGS) -c common.cpp 

最后,链接线:

$(CXX) $(CXXFLAGS) $(GSLFLAGS) myProgram.cpp common.o -o myProgram 

是错误的:源/目标的顺序和在命令行matters上的库。正确的链接线应该是:

$(CXX) $(CXXFLAGS) myProgram.cpp common.o -o myProgram $(GSLFLAGS) 
+0

在链接过程中排序总是很棘手。感谢提醒,解决了很多问题。 –