链接库没有在makefile中正确设置
Linked libraries not set up properly in makefile
我有下面的makefile,我用它来编译一个简单的项目(这个例子只有一个.cpp,包括一些外部头文件和一个共享库):
ifndef _ARCH
_ARCH := $(shell uname -m)
export _ARCH
endif
NAME := Test
MAJOR := 1
MINOR := 5
VERSION := v$(MAJOR)_$(MINOR)
TARGET := $(NAME)_$(VERSION).o
SRCEXT := cpp
SRCDIR := src
INCPATH := inc
OBJDIR := obj
BINDIR := bin
BIN_DEBUGDIR := $(BINDIR)/debug
API_DIR := /DEM_API/Multibody/DEMCoupling
INCLUDES := -I.
-I$(INCPATH)
-I$(API_DIR)
# C++ compiler flag
CXXFLAGS := -Wall -march=native $(INCLUDES) -c
# Linker parameter flags
# Linker library flags
LIBDIRS := -L$(API_DIR)/lib
LDLIBS := -lEDEMCouplingClientV2_2_0
LDFLAGS := $(LIBDIRS)
SRCS := $(shell find $(SRCDIR) -name '*.$(SRCEXT)')
SRCDIRS := $(shell find . -name '*.$(SRCEXT)' -exec dirname {} ; | uniq)
OBJS := $(patsubst %.$(SRCEXT),$(OBJDIR)/%.o,$(SRCS))
###########################################################################
# Rules to compile our files - Do not change below this line!
###########################################################################
ifeq ($(SRCEXT), cpp)
CC = $(CXX)
else
CXXFLAGS += -std=gnu99
endif
.PHONY: all debug release clean distclean
all: $(BINDIR)/$(TARGET)
# Build debug library
debug: CXXFLAGS += -g
debug: clean $(BIN_DEBUGDIR)/$(TARGET)
# strip all symbols from release verison
release: LDFLAGS += -s
release: CXXFLAGS += -O2
release: $(BINDIR)/$(TARGET)
$(BINDIR)/$(TARGET): buildrepo $(OBJS)
@mkdir -p `dirname $@`
# @echo "Linking $@..."
$(CC) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@
# @echo "$@ sucessfully built."
$(BIN_DEBUGDIR)/$(TARGET): buildrepo $(OBJS)
@mkdir -p `dirname $@`
# @echo "Linking $@..."
$(CC) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@
# @echo "$@ sucessfully built."
$(OBJDIR)/%.o: %.$(SRCEXT)
# @echo "Generating dependencies for $<..."
$(call make-depend,$<,$@,$(subst .o,.d,$@))
# @echo "Compiling $<..."
$(CC) $(CXXFLAGS) $< -o $@
clean:
$(RM) -r $(OBJDIR)
distclean: clean
$(RM) -r $(BINDIR)/$(TARGET)
$(RM) -r $(BIN_DEBUGDIR)/$(TARGET)
buildrepo:
$(call make-repo)
define make-repo
for dir in $(SRCDIRS);
do
mkdir -p $(OBJDIR)/$$dir;
done
endef
# usage: $(call make-depend,source-file,object-file,depend-file)
define make-depend
$(CC) -MM
-MMD
-MF $3
-MP
-MT $2
$(CXXFLAGS)
$(LDFLAGS)
$1
endef
它成功地编译了这个项目,但是当我试图从终端运行可执行文件时,我只得到以下错误:
./Test_v1_5.o: error while loading shared libraries: libEDEMCouplingClientV2_2_0.so: cannot open shared object file: No such file or directory
我不明白为什么。
作为测试,我在代码块中设置了相同的项目并编译了发布版本,它工作得很好。
这是我的makefile的构建输出:
for dir in ./src ./old; do mkdir -p obj/$dir; done
g++ -MM -MMD -MF obj/src/Test_v11.d -MP -MT obj/src/Test_v11.o -Wall -march=native -I. -Iinc -I/home/DEM_API/Multibody/DEMCoupling -c -L/opt/DEM/DEM_2.7/lib src/Test_v11.cpp
g++ -Wall -march=native -I. -Iinc -I/home/DEM_API/Multibody/DEMCoupling -c src/Test_v11.cpp -o obj/src/Test_v11.o
src/Test_v11.cpp: In function ‘int main()’:
src/Test_v11.cpp:199: warning: deprecated conversion from string constant to ‘char*’
/home/DEM_API/Multibody/DEMCoupling/ApiTypes.h: At global scope:
/home/DEM_API/Multibody/DEMCoupling/ApiTypes.h:193: warning: ‘const char* NApi::delim()’ defined but not used
g++ -L/home/DEM_API/Multibody/DEMCoupling/lib obj/src/Test_v11.o -lDEMCouplingClientV2_2_0 -o bin/Test_v1_5.o
下面是code::blocks:
的构建日志g++ -Wall -fexceptions -O2 -O3 -Wfatal-errors -Wall -I../Multibody/DEMCoupling -I/home/DEM_API/Multibody/DEMCoupling -c /home/DEM_API/Multibody/EPT/src/Test_v11.cpp -o obj/Release/Multibody/EPT/src/Test_v11.o
/home/DEM_API/Multibody/EPT/src/Test_v11.cpp: In function ‘int main()’:
/home/DEM_API/Multibody/EPT/src/Test_v11.cpp:199: warning: deprecated conversion from string constant to ‘char*’
../Multibody/DEMCoupling/ApiTypes.h: At global scope:
../Multibody/DEMCoupling/ApiTypes.h:193: warning: ‘const char* NApi::delim()’ defined but not used
g++ -L../Multibody/DEMCoupling/lib -L/home/DEM_API/Multibody/DEMCoupling/lib -o bin/Release/Test obj/Release/Multibody/EPT/src/Test_v11.o -s /home/DEM_API/Multibody/DEMCoupling/lib/libDEMCouplingClientV2_2_0.so
Output size is 48.21 KB
Process terminated with status 0 (0 minutes, 2 seconds)
0 errors, 2 warnings (0 minutes, 2 seconds)
有谁知道makefile中可能出现的问题吗?非常感谢帮助!
你的库在一个非标准的地方,所以动态链接器找不到它。
您可以通过设置LD_LIBRARY_PATH
来告诉它在哪里查找:
$ export LD_LIBRARY_PATH=/home/jmorrise/Dropbox/PhD_Docs/EDEM_API/Multibody/EDEMCoupling/lib
$ ./bin/Release/Test
或者,如果您想将库安装到非标准位置,您可以设置用于链接的编译器标志:
-Wl,-rpath -Wl,LIBDIR
其中LIBDIR是指向你的库的路径(逗号前后没有空格)。
(大致)引用autotools的指令:
如果你想链接到指定目录下的已安装库,在链接时必须使用' -LLIBDIR'标志,并执行at
- 将LIBDIR添加到' LD_LIBRARY_PATH'环境变量在执行
- 将LIBDIR添加到' LD_RUN_PATH'环境变量中在链接
- 使用' -Wl,-rpath -Wl,LIBDIR'链接标志
- 让系统管理员将LIBDIR添加到'/etc/ld.so.conf'
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 在makefile中设置GCC路径
- 设置makefile以使用emacs flymake检查c和c++源文件
- 如何在 eclipse makefile 项目中的编译器选项中设置 -std=c++0x
- 如何设置要使用Visual Studio样式输出目录生成的Makefile
- 将Makefile设置为在另一个目录中生成
- GNU Make -在规则/目标中设置shell命令输出中的MAKEFILE变量
- 链接库没有在makefile中正确设置
- 如何设置这个makefile
- makefile.我为一组目标设置LDADD
- 如何将两个Makefile(每个生成的脚本都设置了特定的环境变量)合并到一个Makefile中