我正在尝试为使用复杂库(也取决于libz和libgmp)的项目构建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,$@) -MT $@ $(CPPFLAGS) $< > $@


并且所有似乎都正确地编译为目标文件(.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)


但是它只是失败地在soplex.cpp内部引发了大约100个错误(例如,它取决于-lgmp和-lz,但是找不到它们?在这里粘贴太长时间了)

我很困惑,关于如何解决这个问题的任何想法?
谢谢。

最佳答案

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



更改此:

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


变成这个:

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


如果A调用B中的函数,则始终需要将B放在A后面。至少要使用静态库。

关于c++ - 与Makefile混淆似乎链接但无法调用的库的链接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43826870/

10-14 19:52