分析make.log
创建工程前,首先要明确要编出那些库,需要用到那些源文件。这就是之前保存make.log的原因。
创建工程:
将ubuntu内编译好的文件拖到win10环境下:
建对应c++工程:(app工程即可)
注意,一开始可以先选上costom makefile configuration,避免生成的libzmq.mk有问题,创完之后在取消。
接下来主要要改的就是libzmq.mk
Libzmq.mk解析:
target生产的目标文件的名字:
可以是libzmq.so,libzmq.a(因为当前编译的是库,所以不可以是libzmq)
Depend target:依赖目标类型
常用的有:application_mk,kernel_library_mk
源文件列表:格式如下
有些工程编一个库有几十上百个c文件,灵活利用notepad++中的替换功能可以快速整理出符合格式的所有的c文件,避免一行一行粘贴。
头文件列表:
#*********************************************************************************************************
# Header file search path (eg. LOCAL_INC_PATH := -I"Your header files search path")
#*********************************************************************************************************
LOCAL_INC_PATH := \
-I"src/zeromq_414/include" \
-I"src/zeromq_414/src" \
-I"src/zeromq_414/builds/msvc"
宏定义项:
#*********************************************************************************************************
# Pre-defined macro (eg. -DYOUR_MARCO=1)
#*********************************************************************************************************
LOCAL_DSYMBOL := \
-DHAVE_CONFIG_H \
-D_REENTRANT \
-D_GNU_SOURC \
-D_THREAD_SAFE \
-DZMQ_USE_EPOLL \
-DSYLIXOS
编译参数:
#*********************************************************************************************************
# Compiler flags
#*********************************************************************************************************
LOCAL_CFLAGS :=
LOCAL_CXXFLAGS := -fPIC
依赖库及库路径:
#*********************************************************************************************************
# Depend library (eg. LOCAL_DEPEND_LIB := -la LOCAL_DEPEND_LIB_PATH := -L"Your library search path")
#*********************************************************************************************************
LOCAL_DEPEND_LIB :=
LOCAL_DEPEND_LIB_PATH :=
其他配置项:
编译c++功能时开启对c++及c++异常的支持
OpenMP: open multi-processing 开启多线程编译的支持
注意及易错点:
- 生成的目标文件名要和depend target对应(app或库)
- 源文件一定要写全。使用notepad++进行文本处理完,再数遍,不要误删某行,导致各种奇怪的错误。
- 头文件路径,库文件,库文件路径,尽量不要有空格,中文。如果出错,注意看控制台实际输出的内容,不要过于相信.mk。
- 库文件链接时,注意顺序,一定要保证和linux下的连接顺序一致。不然就有可能编不过去。
- 路径中常用的几个宏:$(SYLIXOS_BASE_PATH)是base的路径,$(SYLIXOS_BASE_PATH)/..才是workspace的路径
- -D可以不指定对应值,但是-DAAA=0,不等于没定义AAA.
- 使用-j8 多线程编译时开openMP。
- 一般情况下不需要改源文件的内容,只要改src下的config.h文件,通过删减支持的宏定义即可。
Sylixos下fork的处理:
由于sylixos下不支持fork,所以要在一开始就尽量看看那些地方用到了fork。
解决方法:(zmq库中没有出现fork,就已之前移植的sshd为例)
把fork中的任务,在单独的函数内实现。
在另一个app中获取函数的地址和参数。通过执行这个app,实现fork的功能。
posix_spawn(&child_pid, "/apps/ssh/child", NULL, NULL, pcCmd, NULL);
测试:
移植的库应该经过充分的测试,可以先在模拟器上跑,再在不同平台的板子上跑。
先从读版本号,到实际使用,再到性能测试。
关于-fPIC
-fPIC 作用于编译阶段,
作用:告诉编译器产生与位置无关代码(Position-Independent Code),
产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
non-PIC 与 PIC 代码的区别主要在于 access global data, jump label 的不同(汇编的意义不同)
详细的参考:
(14条消息) gcc编译参数-fPIC的一些问题_哒哒的博客-CSDN博客
其他:
注意测试用例中使用loaclhost时需要确保在/etc/hosts中有
127.0.0.1 loaclhost