为了避免项目布署麻烦,需要将执行文件尽量静态链接
1. boost库全部静态链接
2. c++库静态链接
1,2点的改变如下,强制链静态库的方法为参数下为-l:libXXXX.a; 对于boost log, 需要将宏-DBOOST_LOG_DYN_LINK去掉
LOCAL_STATICLIBS := boost_log boost_log_setup boost_system boost_filesystem boost_serialization boost_thread boost_chrono
#LOCAL_LIBS := boost_system boost_serialization boost_log pthread boost_thread boost_chrono boost_log_setup ibverbs
LOCAL_LIBS := pthread ibverbs
LOCAL_LINKFLAGS := -static-libgcc -static-libstdc++ $(LIBDIRS:%=-L%) $(OUT_DIR:%=-L%) $(LOCAL_LIBS:%=-l%) $(LOCAL_STATICLIBS:%=-l:lib%.a)
3. 但是对于动态库编译报错,需要将boost 带上参数-fPIC重新编译,原因见下转载
sudo ./bjam cxxflags=-fPIC cflags=-fPIC -a -d+2
sudo ./bjam install
4. 用strip去掉一些符号信息
https://blog.youkuaiyun.com/stpeace/article/details/47090255
5. so由于静态链接会引用许多不该出现的导出符号,编译参数中带-fvisibility=hidden已经失效
使用--version-script参数
$ gcc -shared -o libtest.so a.C -fPIC -Wl,--version-script=exportmap
如
OPENCL_1.0
{
global:
_init;
_fini;
clGetPlatformIDs;
clGetPlatformInfo;
clGetDeviceIDs;
local:
*;
};
========================分割线==========================
转: