gpt4 book ai didi

c++ - 创建静态链接所有依赖项的共享 .so 库

转载 作者:太空狗 更新时间:2023-10-29 23:00:41 24 4
gpt4 key购买 nike

我正在尝试构建我的 .so 库,所有依赖项(主要是 boost)都静态链接。目前,我可以构建静态链接的静态库和动态链接的共享库:

image description

我想将其他依赖项添加到 .so 库,这样它就有 20MB 并且不需要用户安装任何东西。请注意,这只是我们在生产服务器上升级到新的 Boost 1.55 之前的临时解决方案。

我在 Makefile 中这样定义库($ARCH 可以是 32 或 64):

## Multi-arch library locations
LIB32=/usr/lib/i386-linux-gnu/
LIB64=/usr/lib/x86_64-linux-gnu/
LIBDIR:=$(LIB$(ARCH))
##Library directory
LIB=-L $(LIBDIR)
## DYNAMIC
LIBS=-lboost_serialization -lboost_thread -lboost_date_time -lboost_signals -lboost_iostreams -lboost_system -llog4cplus -lcrypto -lssl -lm
## STATIC
SLIBS=$(LIBDIR)libboost_serialization.a $(LIBDIR)libboost_thread.a $(LIBDIR)libboost_date_time.a $(LIBDIR)libboost_signals.a $(LIBDIR)libboost_iostreams.a $(LIBDIR)libboost_system.a $(LIBDIR)liblog4cplus.a

带动态链接的共享库:

这是我的共享库 GCC 命令:

  • 生成文件:

    $(CXX) $(CFLAGS) $(INCLUDE) $(LIB) $(LIBS) -shared -Wl,-soname,$(SHARED_LIB_VERSION) -o $(NEW_LIB_DIR)${SHARED_LIB_VERSION} $(OBJ_CPP_DYN) $(OBJ_C_DYN)
  • 变为:

    g++ -m64 -Wl,--trace -D NDEBUG -I /usr/include/ -I /usr/local/include -L /usr/lib/x86_64-linux-gnu/ -shared -lboost_serialization -lboost_thread -lboost_date_time -lboost_signals -lboost_iostreams -lboost_system -llog4cplus -lcrypto -lssl -lm -Wl,-soname,libLIBNAMEx64.so -o ../Release/libLIBNAMELIBNAMEx64.so ... and much more .o files ...
  • 链接器说:

    -lboost_serialization (/usr/lib/x86_64-linux-gnu//libboost_serialization.so)
    -lboost_thread (/usr/lib/x86_64-linux-gnu//libboost_thread.so)
    -lboost_date_time (/usr/lib/x86_64-linux-gnu//libboost_date_time.so)
    -lboost_signals (/usr/lib/x86_64-linux-gnu//libboost_signals.so)
    -lboost_iostreams (/usr/lib/x86_64-linux-gnu//libboost_iostreams.so)
    -lboost_system (/usr/lib/x86_64-linux-gnu//libboost_system.so)
    -llog4cplus (/usr/lib/x86_64-linux-gnu//liblog4cplus.so)
    -lcrypto (/usr/lib/x86_64-linux-gnu//libcrypto.so)
    -lssl (/usr/lib/x86_64-linux-gnu//libssl.so)

而且有效。

带有静态链接的共享库:

我想我可以用 -static 替换 -shared :

g++ -m64 -Wl,--trace -D NDEBUG -I /usr/include/ -I /usr/local/include  -L /usr/lib/x86_64-linux-gnu/ -static -lboost_serialization -lboost_thread -lboost_date_time -lboost_signals -lboost_iostreams -lboost_system -llog4cplus -lcrypto -lssl -lm -Wl,-soname,libLIBNAMEx64_static_link.so -o ../Release/libLIBNAMEx64_static_link.so ... and much more .o files ...

But I get undefined reference errors everywhere.

So where do I configure how are dependencies linked with my binary? How can I achieve my goal?

More things I tried (edit)

-Wl,--library:

I also tried passing libraries directly to linker in a very assertive manner:

-Wl,--library=:/usr/lib/x86_64-linux-gnu/libboost_serialization.a

并且没有:(这会阻止搜索.a):

 -Wl,--library=/usr/lib/x86_64-linux-gnu/libboost_serialization.a

但是我得到了错误:

  /usr/bin/ld: cannot find -l/usr/lib/x86_64-linux-gnu/libboost_serialization.a

当然,该文件存在于该路径。

Pass just library names:

当然,这里甚至不解释为链接命令:

g++: error: libboost_serialization.a: No such file or directory

有趣的是,如果我改为传递完整路径 (/usr/lib/x86_64-linux-gnu/libboost_iostreams.a),GCC 会将其加倍:

g++: error: /usr/lib/x86_64-linux-gnu//usr/lib/x86_64-linux-gnu/libboost_signals.a: No such file or directory

最佳答案

使用命令man ld,我得到了这个信息:

-static

Do not link against shared libraries. It affects library searching for -l options which follow it. This option also implies --unresolved-symbols=report-all. This option can be used with -shared. Doing so means that a shared library is being created but that all of the library's external references must be resolved by pulling in entries from static libraries.

这个选项正是您想要的:创建一个所有依赖项(主要是 boost)静态链接的共享库。

-l参数用于指定库名,所以应该使用boost_serialization而不是/path/libboost_serialization.a:

-larchive

If you specify -lcommon, then ld will search its path-list for occurrences of "libcommon.a" for every common specified.

当ld尝试搜索静态库时,您可以多次使用-L参数来指定库路径:

-Lsearchdir

例如:-L/usr/lib/x86_64-linux-gnu/

关于c++ - 创建静态链接所有依赖项的共享 .so 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33147138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com