与Makefile混淆链接似乎链接的库,但我不能调用

问题描述:

我试图为使用soplex库(也取决于libz和libgmp)的项目建立一个Makefile。 所以我有这个小的Makefile:与Makefile混淆链接似乎链接的库,但我不能调用

SOPLEXPATH =../../lib/soplex-3.0.0/lib/ 
SOPLEXINCLUDE =../../lib/soplex-3.0.0/src/ 
SOPLEXDEP =../../lib/soplex-3.0.0/src/ 

CC = g++ 
CPPFLAGS = -g -std=c++0x -O3 -I $(SOPLEXINCLUDE) 
#CPPFLAGS += -DNDEBUG 
CPPFLAGS += -pg -ggdb 
CPPFLAGS += -Wall -Werror=return-type 

LIBS = -L $(SOPLEXPATH) -lz -lgmp -lsoplex 

SRCS = $(wildcard ./src/core/*.cpp) 
OBJS = $(addsuffix .o, $(basename $(SRCS))) 
DEPS = $(addsuffix .d, $(basename $(SRCS))) 

all : kea 

kea : $(OBJS) 
    $(CC) $(CPPFLAGS) $(LIBS) -o bin/kea-core $(OBJS) 

clean : 
    rm -f bin/kea-core $(OBJS) $(DEPS) *~ 

-include $(DEPS) 

%.d: %.c 
    @$(CC) -MM -MT $(subst .d,.o,[email protected]) -MT [email protected] $(CPPFLAGS) $< > [email protected] 

而且一切似乎编译正确对象文件(.o),但随后的链接器抱怨找不到的功能soplex::SoPlex::SoPlex()(SoPlex的构造函数):

g++ -g -std=c++0x -O3 -I ../../lib/soplex-3.0.0/src/ -pg -ggdb -Wall -Werror=return-type -c -o src/core/ecircuit.o src/core/ecircuit.cpp 
g++ -g -std=c++0x -O3 -I ../../lib/soplex-3.0.0/src/ -pg -ggdb -Wall -Werror=return-type -c -o src/core/solver_soplex.o src/core/solver_soplex.cpp 
g++ -g -std=c++0x -O3 -I ../../lib/soplex-3.0.0/src/ -pg -ggdb -Wall -Werror=return-type -c -o src/core/main.o src/core/main.cpp 
g++ -g -std=c++0x -O3 -I ../../lib/soplex-3.0.0/src/ -pg -ggdb -Wall -Werror=return-type -L ../../lib/soplex-3.0.0/lib/ -lz -lgmp -lsoplex -o bin/kea-core ./src/core/ecircuit.o ./src/core/solver_soplex.o ./src/core/main.o 
./src/core/solver_soplex.o: In function `SolvSoplex::SolvSoplex(ECircuit&, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >&, SolvSoplex::Mode)': 
/home/diego/Projects/kea-landscape-tool/src/core/solver_soplex.cpp:9: undefined reference to `soplex::SoPlex::SoPlex()' 
/home/diego/Projects/kea-landscape-tool/src/core/solver_soplex.cpp:9: undefined reference to `soplex::SoPlex::~SoPlex()' 
collect2: error: ld returned 1 exit status 
Makefile:20: recipe for target 'kea' failed 
make: *** [kea] Error 1 

由于所有的.o文件被创建我试图做手工编译: g++ -g -std=c++0x -O3 -I ../../lib/soplex-3.0.0/src/ -Wall -Werror=return-type -pg -ggdb -L/home/diego/Projects/kea-landscape-tool/../../lib/soplex-3.0.0/lib/ -lsoplex -lz -lgmp -o bin/kea-core src/core/main.o src/core/ecircuit.o src/core/solver_soplex.o ,并将它与同样的错误失败。

然后,我尝试切换-L-l..标志这样的位置,它编译:g++ -g -std=c++0x -O3 -I ../../lib/soplex-3.0.0/src/ -Wall -Werror=return-type -pg -ggdb -o bin/kea-core src/core/main.o src/core/ecircuit.o src/core/solver_soplex.o -L/home/diego/Projects/kea-landscape-tool/../../lib/soplex-3.0.0/lib/ -lsoplex -lz -lgmp

看到的是,我试图改变规则在Makefile如下:

kea : $(OBJS) 
    $(CC) $(CPPFLAGS) -o bin/kea-core $(OBJS) $(LIBS) 

但它只是失败了引发大约100错误全部soplex.cpp里面(因为,它取决于-lgmp和-lz,但它找不到它们?太长,以粘贴在这里)

我很漂亮c如何解决这个问题的任何想法? 谢谢。

尝试将$ LIBS放在命令的末尾。


更改此:

LIBS = -L $(SOPLEXPATH) -lz -lgmp -lsoplex 

进入这个:

LIBS = -L $(SOPLEXPATH) -lsoplex -lgmp -lz 

你总是需要把B A后,如果A在B中调用函数使用静态库为最。

+0

谢谢!这工作完美!你的解释是有道理的。我还可以问:只有:上面指定的规则'kea:$(OBJS)'与末尾的库文件有什么区别,并且增加了另一个规则'%.o:%.c'与文本'$ (CC)$(CPPFLAGS)$(LIBS)-o bin/kea-core $(OBJS)'?我在其他地方看到过这种规则,我不确定为什么要这样做。再次感谢! (这两者现在似乎都在工作,我修复了LIBS,但无法说明有什么区别) – ddeunagomez

+1

%.o:%.c规则告诉'make'如何将C源文件编译为目标文件。 Make默认有这样一个规则,所以除非你需要在那里做一些特殊的事情,否则你不需要给它。请注意,默认规则在其编译规则中使用C_FLAGS或类似的东西,所以设置标志不是制定自定义规则的借口。我已经看到它用于确定目标文件的写入位置。 –