添加库

时间:2016-07-05 10:30:15

标签: c++ include autotools

我正在对现有项目进行一些修改,这个项目非常大,所以它是用autotools构建的。修改涉及Ibex库,所以我在其中一个源文件中添加了#include“ibex.h”。库已正确安装在我的系统上,我有以下文件:

  • /usr/local/lib/libibex.a
  • /usr/local/include/ibex/ibex.h
  • /usr/local/share/pkgconfig/ibex.pc

pkg-config命令的结果:

$ pkg-config --libs ibex
-L/usr/local/lib -libex -lprim -lClp -lCoinUtils -lm
$ pkg-config --cflags ibex
-frounding-math -ffloat-store -I/usr/local/include -I/usr/local/include/ibex

我想要使用ibex的compil单元对应的原始Makefile.am如下:

noinst_LTLIBRARIES = liblrasolver.la

AM_CPPFLAGS=$(config_includedirs)

liblrasolver_la_SOURCES = LAVar.h LAVar.C Delta.h Delta.C LRASolver.h LRASolver.C LAArray.h LAArray.C LARow.h LARow.C LAColumn.h LAColumn.C

if WANT_LIBRARY
include_HEADERS = Delta.h LAArray.h LAColumn.h LARow.h LAVar.h LRASolver.h
endif

我这样修改了它:

noinst_LTLIBRARIES = liblrasolver.la

AM_CPPFLAGS=$(config_includedirs) `pkg-config --cflags ibex`
AM_LDFLAGS=`pkg-config --libs ibex` -lblas -llapack

liblrasolver_la_SOURCES = LAVar.h LAVar.C Delta.h Delta.C LRASolver.h LRASolver.C LAArray.h LAArray.C LARow.h LARow.C LAColumn.h LAColumn.C

if WANT_LIBRARY
include_HEADERS = Delta.h LAArray.h LAColumn.h LARow.h LAVar.h LRASolver.h
endif

通过查看随ibex源提供的通用Makefile编译ibex项目来实现此修改:

SRCS=$(wildcard *.cpp)
BINS=$(SRCS:.cpp=)

CXXFLAGS := $(shell pkg-config --cflags ibex) 
LIBS     := $(shell pkg-config --libs  ibex) -lblas -llapack

ifeq ($(DEBUG), yes)
CXXFLAGS := $(CXXFLAGS) -O0 -g -pg -Wall -frounding-math  
else
CXXFLAGS := $(CXXFLAGS) -O3 -DNDEBUG -Wno-deprecated -frounding-math 
endif

all: $(BINS)

% : %.cpp
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ $< $(LIBS)

clean:
    rm -f $(BINS)

好的,autoreconf工作,以及./configure(虽然它的输出从来没有谈到我发现可疑的“ibex”)。但是失败了。找不到标题:

../../../src/tsolvers/lrasolver/LRASolver.h:38:18: fatal error: ibex.h: No such file or directory
 #include "ibex.h"

1 个答案:

答案 0 :(得分:0)

您未正确使用pkg-config。您应该使用PKG_CHECK_MODULES宏,请参阅参考https://autotools.io/pkgconfig/pkg_check_modules.html(完全披露:我写过。)

您还错误地使用AM_LDFLAGS,因为库不是ldflags。您应该使用_LIBADD