如何使用 gcc 创建和使用自定义共享库?
Posted
技术标签:
【中文标题】如何使用 gcc 创建和使用自定义共享库?【英文标题】:how to create and use a self-defined shared library with gcc? 【发布时间】:2016-03-30 09:21:23 【问题描述】:我正在尝试编写一个简单的示例共享库makefile,但是我遇到了一些错误并且无法处理它,请帮助我,谢谢。
这是我的生成文件:
exampleMain.o: exampleMain.cpp
g++ -std=c++11 -I./ -Wall -g -c exampleMain.cpp
# (1) Basic
example.o: example.cpp
g++ -std=c++11 -I./ -Wall -g -c example.cpp
basic: example.o exampleMain.o
g++ -std=c++11 -Wall -g -pthread example.o exampleMain.o -o basic.exe
# (2) Static Library
static.o: example.cpp
g++ -std=c++11 -I./ -Wall -g -c example.cpp -o static.o
libstatic.a: static.o
ar rcs libstatic.a static.o
static: libstatic.a exampleMain.o
g++ exampleMain.o libstatic.a -pthread -o static.exe
# (3) Simple Shared Library
shared.o: example.cpp
g++ -std=c++11 -I./ -Wall -g -fPIC -c example.cpp -o shared.o
libshared.so: shared.o
g++ -shared -Wl,-soname,libshared.so -o libshared.so shared.o
shared: libshared.so exampleMain.o
g++ exampleMain.o -o shared.exe -L./ -lshared -pthread
# (4) Clean
clean:
rm *.o *.so *.a *.exe *.so.*
这个makefile支持4个操作:
(1) 制作基本:basic.exe (2) 制作静态:static.exe (3) 使共享:shared.exe (4) 清理:rm 对象(3) 可以制作,但是当我尝试“./shared.exe”时,它说:./shared.exe:加载共享库时出错:libshared.so:无法打开共享对象文件:没有这样的文件或目录
这是我的示例代码和生成文件链接:https://github.com/zhaochenyou/Tips/tree/master/tool_chain/make/basic
【问题讨论】:
问题不是你的makefile。您需要告诉动态链接器如何在运行时使用 RPATH 或 LD_LIBRARY_PATH 查找库。这个问题已经在 *** 和其他地方被问了数千次并得到了回答。搜索“加载共享库时出错” 【参考方案1】:Make 已经为您需要的大部分内容内置了规则,以下内容应该适用于在共享和非共享之间切换时需要重新制作 .o
文件的警告
CXXFLAGS := -std=c++11 -Wall -g -pthread
LDFLAGS := -g -pthread
basic.exe static.exe shared.exe: exampleMain.o
basic.exe: example.o
static.exe: libstatic.a
shared.exe: libshared.so
libstatic.a: libstatic.a(example.o)
libshared.so: CXXFLAGS += -fPIC
libshared.so: LDFLAGS += -shared -Wl,-soname,libshared.so
libshared.so: example.o
basic.exe static.exe shared.exe libshared.so:
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
clean: ; $(RM) exmapleMain.o example.o libshared.so libstatic.a basic.exe static.exe shared.exe
重要提示:切勿在删除时使用通配符,您可能会删除您不负责的内容。
至于错误阅读this,尤其是“安装和使用共享库”部分。
【讨论】:
感谢您的耐心等待,我可以看到您的 makefile 比我的要好得多,非常感谢您的分享。 @zhaochenyou 在阅读了乔纳森的评论后,我才意识到你的问题实际上与 makefile 无关,但我很高兴你发现答案很有用。 是的,它确实有用,我的makefile太原始了,你的很专业。【参考方案2】:在@user657267 的帮助下,我编写了一个示例makefile,它支持这些:
制作basic.exe 制作 libstatic.a 制作静态.exe 制作 libshared.so 制作shared.exe源cpp文件是example.hpp、example.cpp、exampleMain.cpp。有一个简单的示例函数和一个主函数。 这是主文件:
# additional compile flags
# CFLAGS for c
# CXXFLAGS for c++
CXXFLAGS := -std=c++11 -Wall -g -pthread -I./
# additional link flags
LDFLAGS := -pthread
# dependent object
basic.exe static.exe shared.exe: exampleMain.o
basic.exe: example.o
static.exe: libstatic.a
shared.exe: libshared.so
# additional link flags for shared.exe
# NOTICE: -Wl,-rpath=./ is for libshared.so runtime path
shared.exe: LDFLAGS += -L./ -Wl,-rpath=./
# NOTICE: this command also works:
# libstatic.a: libstatic.a(example.o)
libstatic.a: example.o
ar rcs libstatic.a example.o
# additional compile and link flags for libshared.so
libshared.so: CXXFLAGS += -fPIC
libshared.so: LDFLAGS += -shared -Wl,-soname,libshared.so
# dependent object
libshared.so: example.o
# $^: all dependent objects
# $@: all target objects
# $(CXX): default c++ compiler
# $(LDLIBS): default c++ libraries
basic.exe static.exe shared.exe libshared.so:
$(CXX) $(CXXFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
# $(RM): default rm command
clean:
$(RM) exmapleMain.o example.o libshared.so libstatic.a basic.exe static.exe shared.exe
【讨论】:
以上是关于如何使用 gcc 创建和使用自定义共享库?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有共享库的情况下使用 GMP、MPFR、MPC、ELF 逐个安装 GCC?
LLINUX GCC 编译C使用自定义动态链接库.so的问题
如何在 GCC Linux 中指定非默认共享库路径?运行时出现“加载共享库时出错”
如何使用 chart_flutter 库创建自定义 LegendContentBuilder 以根据选择显示和隐藏系列?