我正在尝试构建我的.so
库,所有依赖项(主要是boost)静态链接。目前,我可以构建静态链接的静态库和动态链接的共享库:
我想将其他依赖项添加到.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
这是我的共享lib 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 ...
Linker说:
-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)
它有效。
我以为我可以用-shared
替换-static
:
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 ...
但我到处都有 undefined reference
错误。
那么我在哪里配置依赖项如何与我的二进制文件链接?我怎样才能实现目标?
-Wl,--library
我还尝试以非常自信的方式将库直接传递给链接器:
-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
当然,该文件存在于该路径中。
当然,这里甚至没有解释为链接命令:
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
答案 0 :(得分:1)
使用命令man ld
,我收到了以下信息:
-static
不要链接共享库。它会影响库搜索跟随它的
-l
选项。此选项还隐含--unresolved-symbols=report-all
。此选项可与-shared
一起使用。这样做意味着正在创建共享库,但必须通过从静态库中提取条目来解析所有库的外部引用。
此选项正是您想要的:创建一个包含静态链接的所有依赖项(主要是boost)的共享库。
-l
参数用于指定库名称,因此您应使用boost_serialization
代替/path/libboost_serialization.a
:
-larchive
如果指定
-lcommon
,则ld将在其路径列表中搜索" libcommon.a"的出现次数。对于指定的每个common
。
当ld尝试搜索静态库时,您可以多次使用-L
参数来指定库路径:
-Lsearchdir
例如:
-L/usr/lib/x86_64-linux-gnu/
答案 1 :(得分:0)
您可以尝试-Wl,--whole-archive ${your library} -Wl,--no-whole-archive
。