LINUX 动态库编译和使用的注意事项
2017-11-24 09:42
387 查看
动态库编译
下面是动态库编译的脚本编写$(DLLTARGET): $(LIBOBJS) $(CC) -shared -fPIC $(CXXFLAGS) -Wl,--whole-archive $(LDLIBS) $(LIBOBJS) -Wl,-no-whole-archive -Wl,--retain-symbols-file=exports.map -Wl,--version-script=exports.map -o $@
几点注意:
1. 对于引用的静态库,通过-Wl,–whole-archive命令嵌入进来,后面运行就不依赖于这些静态库了。
2. LINUX默认导出所有符号,这个容易引起符号冲突。可以通过-fvisibility=hidden -fvisibility-inlines-hidden,这个我在简单的DEMO里面可以用,真正的工程里面死活不行,而且理论上来说对于依赖的其他静态库是没用的,这份方案后来放弃了。用–retain-symbols-file –version-script方案,这个很好用,只在exports.map里面输入要导出的符号就可以。
exports.map的例子:
{ global:func1;func2; local: *; };
动态库的使用
$(EXEC): $(OBJS) $(P_OUTLIB)/libBasicTool.a $(P_OUTLIB)/libFreeNet.so $(CPP) $(CFLAGS) -o $@ $(OBJS) -L$(P_OUTLIB) -lBasicTool -lresolv -lrt -lFreeNet -lpthread
几点注意:
1. CFLAGS不能加-static
几个静态库合并成一个静态库
要先解压,然后一起合并。LDLIBS = libBasicTool.a \ libNetwork.a \ libDynaStruct2.a \ libTinyXml.a LIBSOBJS = ./build_tmp/libBasicTool.a/*.o \ ./build_tmp/libNetwork.a/*.o \ ./build_tmp/libDynaStruct2.a/*.o \ ./build_tmp/libTinyXml.a/*.o $(LIBTARGET): $(LIBOBJS) rm -rf build_tmp mkdir build_tmp @for lib in $(LDLIBS); do \ mkdir build_tmp/$$lib;\ cd build_tmp/$$lib;\ $(AR) x $(P_OUTLIB)/$$lib;\ cd ../..;\ done $(AR) rsuv $(LIBTARGET) $(LIBSOBJS) $(LIBOBJS) ranlib $(LIBTARGET) rm -rf build_tmp
相关文章推荐
- Linux下关于动态库调用动态库及编译需要注意的事项
- 【linux 开发】多个动态库加载使用注意事项
- json-c-0.9 在linux上编译使用 以及使用注意事项
- Ubuntu 下用C语言访问gdbm数据库编译注意事项(使用ndbm方式)
- 使用静态库时需要注意的事项(gcc下程序调用静态库编译命令:主文件必须在静态库前面!)
- LINUX下PHP使用PDO访问MYSQL的连接设置注意事项
- archlinux(内核自已编译过) nvidia linux 的安装注意事项
- 免安装Oracle客户端使用PL/SQL连接Linux Oracle 注意事项
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在linux或unix服务器上安装、使用MySQL的注意事项
- 在Linux中使用STL迭代器的一点注意事项
- 在Linux/Unix中使用错误保留符需注意的事项(2006-02-17)
- 编译linux2.6.x内核步骤及注意事项
- 关于Linux driver中device_create()使用的注意事项
- 关于Linux driver中device_create()使用的注意事项
- V8 JavaScript Engine 编译与使用注意事项-编译V8(win7+VS2008)
- OPENCV的在LINUX下的安装使用注意事项
- linux下使用ssh管理VPS的注意事项小结
- linux下静态库、动态库的编译和使用
- 总结下linux下的IPC使用原理及注意事项