我正在修改Anyterm(http://anyterm.org/),以添加在进行某些更改后所需的配置文件。

我正在使用inih项目(https://github.com/benhoyt/inih)来读取该文件。该文件包含我要连接的数据库数据。
另外,我包括mysql库,在编译时一切正常。

当我尝试将新的inih库添加到Makefile时,问题就来了。 Inih的文件扩展名为.c和.cpp,但是anyterm的文件扩展名为.cc

Makefile是这样的:

default_target: anytermd

SRC_DIR=../src

VPATH=${SRC_DIR} .

UNAME_S=$(shell uname -s)

ifeq (${UNAME_S},Darwin)
else
HAVE_GNU_LD=1
endif

LIBPBE_DIR=../libpbe

CPP_FLAGS=

GCC_FLAGS=-pthread
#GCC_FLAGS=-D_REENTRANT

COMPILE_FLAGS=$(CPP_FLAGS) $(GCC_FLAGS) -W -Wall ${OPTIMISE_FLAGS} ${DEBUG_FLAGS}

CC_COMPILE_FLAGS=$(COMPILE_FLAGS)

LINK_FLAGS=${GCC_FLAGS} ${DEBUG_FLAGS} \
        -lutil

ifeq (${UNAME_S},OpenBSD)
LINK_FLAGS+=-liconv
endif

ifeq (${UNAME_S},Darwin)
LINK_FLAGS+=-liconv
endif

LIBPBE_MAKE_OPTIONS=
include ../libpbe.mk

CC_SRCS=$(sort $(notdir $(wildcard ${SRC_DIR}/*.cc)) static_content.cc)

BLOBFILES=anyterm.html anyterm.js anyterm.css copy.png paste.png copy.gif paste.gif

BLOBS=$(addsuffix .blob.o,$(BLOBFILES))

OBJS=$(addsuffix .o,$(notdir $(basename $(CC_SRCS))))

%.o: %.cc
        $(CXX) $(CC_COMPILE_FLAGS) -c $<

ifdef HAVE_GNU_LD
%.blob.o: ../browser/%
        cp $^ . ; $(LD) -r -b binary -o $@ $* ; rm $*

else
%.blob.c: ../browser/% ./mk_blob

        ./mk_blob $(subst .,_,$*) < $< > $@

mk_blob: mk_blob.c
        $(CC) -o $@ $<
endif


anytermd: $(OBJS) $(BLOBS) $(LIBPBE_LIB)
        $(CXX) -o $@ -I/usr/include/mysql  -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -fasynchronous-unwind-tables -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fwrapv -fPIC   -DUNIV_LINUX -DUNIV_LINUX $(OBJS) -rdynamic -L/usr/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -lssl -lcrypto $(BLOBS) $(LINK_FLAGS)

%.d: %.cc
    $(CXX) -MM -MG -MT $@ -MT $(<:%.cc=%.o) $(CPP_FLAGS) $(GCC_FLAGS) -o $@ $<

DEPENDS=$(addsuffix .d,$(basename $(OBJS)))

-include $(DEPENDS)

install: FORCE
    install anytermd /usr/local/bin

clean: FORCE
    $(RM) -f *.o *.blob.c static_content.cc

veryclean: clean
        $(RM) *.d

.PHONY: default_target install FORCE


static_content.cc: ../scripts/mk_static_content.sh ../browser/*
        PATH="$${PATH}:../scripts" ../scripts/mk_static_content.sh $(BLOBFILES) > $@

static_content.o: CPP_FLAGS+=-I../src


inih的文件位于src目录中,当我尝试执行“ make”操作时,出现以下错误:

Anyterm.o: In function `checkPermission(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, booking_info&)':
Anyterm.cc:(.text+0x4527): undefined reference to `INIReader::INIReader(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
Anyterm.cc:(.text+0x4596): undefined reference to `INIReader::ParseError() const'
Anyterm.cc:(.text+0x46a7): undefined reference to `INIReader::Get(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const'
Anyterm.cc:(.text+0x4894): undefined reference to `INIReader::Get(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const'
Anyterm.cc:(.text+0x49e2): undefined reference to `INIReader::Get(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const'
Anyterm.cc:(.text+0x4af5): undefined reference to `INIReader::Get(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const'


这使我相信链接器中缺少inih的库。
我需要在Makefile中进行哪些更改以使用inih进行编译?

非常感谢。

最佳答案

我对Makefile进行了以下更改并为我工作:

CPP_FLAGS=-I$(SRC_DIR)
...
FILTER=mk_blob.c
CC_SRCS=$(sort $(notdir $(wildcard ${SRC_DIR}/*.cc)) static_content.cc)
CC_SRCS+=$(sort $(filter-out ${FILTER},$(notdir $(wildcard ${SRC_DIR}/*.c))))
CC_SRCS+=$(sort $(notdir $(wildcard ${SRC_DIR}/*.cpp)))
...
%.o: %.c
    $(CXX) $(CC_COMPILE_FLAGS) -c $<

%.o: %.cpp
    $(CXX) $(CC_COMPILE_FLAGS) -c $<


感谢所有人的帮助。

关于c++ - 添加新库以编译任何术语。如何编辑Makefile?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36894080/

10-13 08:58