首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Makefile混淆链接一个看似链接但我无法调用的库

与Makefile混淆链接一个看似链接但我无法调用的库
EN

Stack Overflow用户
提问于 2017-05-07 01:07:59
回答 1查看 52关注 0票数 0

我正在尝试为一个使用soplex库(也依赖libz和libgmp)的项目构建一个Makefile。所以我有一个小Makefile:

代码语言:javascript
复制
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,$@) -MT $@ $(CPPFLAGS) $< > $@

而且似乎都正确地编译为对象文件(.o),但是链接器抱怨没有找到函数soplex::SoPlex::SoPlex() (SoPlex的构造函数):

代码语言:javascript
复制
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中的规则更改如下:

代码语言:javascript
复制
kea : $(OBJS)
    $(CC) $(CPPFLAGS) -o bin/kea-core $(OBJS) $(LIBS)

但它只是不幸地失败了,触发了大约100个soplex.cpp内部的错误(比如,它依赖于-lgmp和-lz,但却找不到它们?)太长,不能粘贴在这里)

我很困惑,知道怎么解决这个问题吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-07 01:20:06

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

改变这一点:

代码语言:javascript
复制
LIBS = -L $(SOPLEXPATH) -lz -lgmp -lsoplex

这方面:

代码语言:javascript
复制
LIBS = -L $(SOPLEXPATH) -lsoplex -lgmp -lz

如果A调用在B中使用静态库,则始终需要将B放在A之后。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43826870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档