【发布时间】:2016-01-13 19:53:32
【问题描述】:
我正在尝试构建我的 .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
具有动态链接的共享库:
这是我的共享库 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)
而且它有效。
带有静态链接的共享库:
我以为我可以将-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 ... 以及更多 .o 文件...
但我到处都收到 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
当然,该文件存在于该路径中。
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
【问题讨论】:
-
this question 不能解决您的问题吗?
-
g++: error: libboost_date_time.a: No such file or directory- 不,它没有。 -
@MichaelFoukarakis 我有静态
.a和动态.soboost 库。这同样适用于我正在使用的其他人。正如我所说,静态链接的静态库编译没有问题。