Mac:Codelite IDE制作的make文件变体找不到gsl

时间:2018-08-29 14:48:46

标签: makefile gsl

我正在尝试将功能iceemdan()添加到开源库libeemd.c中。我正在尝试使用IDE对其进行调试。生成文件对clang结果的首次调用是因为clang无法找到gsl库,即使该库存在并且IDE生成文件所基于的make文件也可以轻松链接到gsl。

以下是使用Codelite IDE生成文件的生成文件输出(仅gsl错误和上下文):

Executing Pre Build commands ...
Done
make[1]: Leaving directory '/Users/Common/iceemdan-dev/iceemdan-dev/iceemdan-clang'
make[1]: Entering directory '/Users/Common/iceemdan-dev/iceemdan-dev/iceemdan-clang'
clang -o ./Debug/iceemdan-clang @"iceemdan-clang.txt" -L.   
Undefined symbols for architecture x86_64:
  "_gsl_linalg_solve_tridiag", referenced from:
    _emd_evaluate_spline in main.c.o
  "_gsl_poly_dd_eval", referenced from:
    _emd_evaluate_spline in main.c.o
  "_gsl_poly_dd_init", referenced from:
    _emd_evaluate_spline in main.c.o
  "_gsl_ran_gaussian", referenced from:
    _iceemdan in main.c.o
    _eemd in main.c.o
    _ceemdan in main.c.o
  "_gsl_rng_alloc", referenced from:
    _allocate_eemd_workspace in main.c.o
  "_gsl_rng_free", referenced from:
    _free_eemd_workspace in main.c.o
  "_gsl_rng_mt19937", referenced from:
    _allocate_eemd_workspace in main.c.o
  "_gsl_rng_set", referenced from:
    _set_rng_seed in main.c.o
  "_gsl_set_error_handler_off", referenced from:
    _iceemdan in main.c.o
    _eemd in main.c.o
    _ceemdan in main.c.o
      _emd_evaluate_spline in main.c.o
  "_gsl_sf_sin", referenced from:
      _main in main.c.o
  "_gsl_stats_sd", referenced from:
      _iceemdan in main.c.o
      _eemd in main.c.o
      _ceemdan in main.c.o
  "_gsl_strerror", referenced from:
      _emd_evaluate_spline in main.c.o
  "_gsl_vector_view_array", referenced from:
      _emd_evaluate_spline in main.c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [iceemdan-clang.mk:82: Debug/iceemdan-clang] Error 1
make[1]: Leaving directory '/Users/Common/iceemdan-dev/iceemdan-dev/iceemdan-clang'
make: *** [Makefile:5: All] Error 2

此make文件是对要在Mac上运行的打包make文件的修改,可以正常工作:

.PHONY: all clean install uninstall

version := 1.4.1
gsl_flags := $(shell pkg-config --libs --cflags gsl)
ifeq ($(gsl_flags),)
$(error Failed to query GSL complilation flags from pkg-config)
endif
gsl_flags += -DHAVE_INLINE
commonflags := -Wall -Wextra -std=c99 -pedantic -Wno-unknown-pragmas -Wshadow -Wpointer-arith
commonflags += $(CFLAGS)
commonflags += -g -DEEMD_DEBUG=0
#commonflags += -fopenmp
commonflags += -DCLANG
PREFIX ?= /usr

SONAME = -soname
ifeq ($(shell uname -s),Darwin)
    SONAME = -install_name
endif

define uninstall_msg
If you used $(PREFIX) as the prefix when running `make install`,
you can undo the install by removing these files:
$(PREFIX)/include/eemd.h
$(PREFIX)/lib/libeemd.a
$(PREFIX)/lib/libeemd.so
$(PREFIX)/lib/libeemd.so.$(version)
endef
export uninstall_msg

all: libeemd.so.$(version) libeemd.a eemd.h

clean:
    rm -f libeemd.so libeemd.so.$(version) libeemd.a eemd.h obj/eemd.o
    rm -rf obj

install:
    install -d $(PREFIX)/include
    install -d $(PREFIX)/lib
    install -m644 eemd.h $(PREFIX)/include
    install -m644 libeemd.a $(PREFIX)/lib
    install libeemd.so.$(version) $(PREFIX)/lib
    cp -Pf libeemd.so $(PREFIX)/lib

uninstall:
    @echo "$$uninstall_msg"

obj:
    mkdir -p obj

obj/eemd.o: src/eemd.c src/eemd.h | obj
    clang $(commonflags) -c $< $(gsl_flags) -o $@

libeemd.a: obj/eemd.o
    $(AR) rcs $@ $^

libeemd.so.$(version): src/eemd.c src/eemd.h
    clang $(commonflags) $< -fPIC -shared -Wl,$(SONAME),$@ $(gsl_flags) -o $@
    ln -sf $@ libeemd.so

eemd.h: src/eemd.h
    cp $< $@

Codelite二级生成文件在这里。 (第一级只是调用它。)为了避免覆盖好代码,我在另一个目录中运行。

##
## Auto Generated makefile by CodeLite IDE
## any manual changes will be erased      
##
## Debug
ProjectName            :=iceemdan-clang
ConfigurationName      :=Debug
WorkspacePath          :=/Users/Common/iceemdan-dev/iceemdan-dev
ProjectPath            :=/Users/Common/iceemdan-dev/iceemdan-dev/iceemdan-clang
IntermediateDirectory  :=./Debug
OutDir                 := $(IntermediateDirectory)
CurrentFileName        :=
CurrentFilePath        :=
CurrentFileFullPath    :=
User                   :=Coleman Family
Date                   :=08/08/2018
CodeLitePath           :="/Users/Common/Library/Application Support/CodeLite"
LinkerName             :=clang
SharedObjectLinkerName :=clang -shared -fPIC
ObjectSuffix           :=.o
DependSuffix           :=
PreprocessSuffix       :=.o.i
DebugSwitch            :=-gstab
IncludeSwitch          :=-I
LibrarySwitch          :=-l
OutputSwitch           :=-o 
LibraryPathSwitch      :=-L
PreprocessorSwitch     :=-D
SourceSwitch           :=-c 
OutputFile             :=$(IntermediateDirectory)/$(ProjectName)
Preprocessors          :=
ObjectSwitch           :=-o 
ArchiveOutputSwitch    := 
PreprocessOnlySwitch   :=-E 
ObjectsFileList        :="iceemdan-clang.txt"
PCHCompileFlags        :=
MakeDirCommand         :=mkdir -p
LinkOptions            :=  
IncludePath            :=  $(IncludeSwitch). $(IncludeSwitch). 
IncludePCH             := 
RcIncludePath          := 
Libs                   := 
ArLibs                 :=  
LibPath                := $(LibraryPathSwitch). 

##
## Common variables
## AR, CXX, CC, AS, CXXFLAGS and CFLAGS can be overriden using an environment variables
##
AR       := ar rcus
CXX      := clang++
CC       := clang
CXXFLAGS :=  -g -O0 -Wall $(Preprocessors)
CFLAGS   :=  $(commonflags) $< -fPIC -shared -Wl $@ $(gsl_flags) -o $@ $(Preprocessors)
ASFLAGS  := 
AS       := llvm-as


##
## User defined environment variables
##
CodeLiteDir:=/Applications/codelite.app/Contents/SharedSupport/
PATH:=/Users/Common/usr/local/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/opt/local/bin:/opt/local/sbin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/TeX/texbin:/opt/local/include
Srcs=main.c 

Objects0=$(IntermediateDirectory)/main.c$(ObjectSuffix) 



Objects=$(Objects0) 

##
## Main Build Targets 
##
.PHONY: all clean PreBuild PrePreBuild PostBuild MakeIntermediateDirs
all: $(OutputFile)

$(OutputFile): $(IntermediateDirectory)/.d $(Objects) 
    @$(MakeDirCommand) $(@D)
    @echo "" > $(IntermediateDirectory)/.d
    @echo $(Objects0)  > $(ObjectsFileList)
    $(LinkerName) $(OutputSwitch)$(OutputFile) @$(ObjectsFileList) $(LibPath) $(Libs) $(LinkOptions)

MakeIntermediateDirs:
    @test -d ./Debug || $(MakeDirCommand) ./Debug


$(IntermediateDirectory)/.d:
    @test -d ./Debug || $(MakeDirCommand) ./Debug

PreBuild:
    @echo Executing Pre Build commands ...
    $(eval gsl_flags = -L/opt/local/lib -lgsl -lgslcblas -lm -I/opt/local/include -DHAVE_INLINE)
    $(eval commonflags := -Wall -Wextra -std=c99 -pedantic -Wno-unknown-pragmas -Wshadow -Wpointer-arith)
    $(eval commonflags += $(CFLAGS))
    $(eval commonflags += -g -DEEMD_DEBUG=0)
    $(eval commonflags += -DCLANG)
    $(eval PREFIX ?= /usr)
    @echo Done

# all

Debug/main.c.o: main.c 
#src/eemd.h | Debug
    clang $(commonflags) -c $< $(gsl_flags) -o $@

Debug/main.c.a: Debug/main.c.o
    $(AR) rcs $@ $^

eemd: main.c src/eemd.h
    clang $(commonflags) $< -fPIC -shared -Wl, ,$@ $(gsl_flags) -o $@

我很抱歉这篇文章的长度。过去,我只运行未修改的make文件,而不调试它们。因此,很多新内容对我来说并不透明。我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不得不欺骗使用全局变量构建main.c.o的命令。