1. dlopen 如果用这种模式 RTLD_NODELETE,会报错,
无法加载 dlerror() 提示 invalid mode for dlopen(): Invalid argument
RTLD_NODELETE: 在dlclose()期间不卸载库,并且在以后使用dlopen()重新加载
库时不初始化库中的静态变量。这个flag不是POSIX-2001标准。
换成
RTLD_LAZY
RTLD_NOW
问题解决。
2.bash:./configure /bin/sh^M: bad interpreter: No such file or directory
查了半天才知道,原来configure文件是dos格式的,怎么转换成unix格式的呢?
这就要用到vi的强大功能了:
vi configure
:set ff=unix
:wq
然后再./configure
set ff=unix : 告诉 vi 编辑器,使用unix换行符
造成这个原因是:window换行与linux换行符不一样:
----dos(换行符为\r\n) mac(换行为\r)linux(换行为\n)
3.configure: error: cannot run /bin/sh ./config.sub解决办法
1、确定已安装
libtool
libtool-ltdl
libtool-ltdl-devel
否则则安装:
yum install libtool
yum install libtool-ltdl
yum install libtool-ltdl-devel
安装编译依赖包
yum install nasm autoreconf
执行命令:
autoreconf -fiv
mkdir release 创建 release 文件夹
然后 ./configure --prefix=$(pwd)/release --enable-shared=no
--prefix参数是强制设定install之后生成文件的存放目录,加上这个参数有利于将输出文件统一拷贝到开发板上
--enable-shared参数是设置生成的lib库为共享库,即生成***.so, ***.so.x文件
--enable-static参数是设置生成的lib库为静态库,即生成***.a文件(注意:如果不需要在项目中加入静态库的话,此参数可以不加)
make
make install
4. undefined symbol: pthread_once
解决办法:在cmakelists.txt添加“-pthread”
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
5. 遇到Makefile:642: .deps/jmemnobs.Plo: No such file or directory 一大堆
可能是config.sub 带的 在Makefile文件中 找到相应的行 直接删除就可以。
例:下面这些全删除
include ./$(DEPDIR)/jmemnobs.Plo
6.遇到 xxxxxx : line 3: $'\r': command not found
格式有问题,转换一下就可以 但set ff=unix 不好用有时
apt-cyg install dos2unix
dos2unix xxxx
例:./libtool: line 433: $'\r': command not found
[root@c557867f64e4 jpeg-9a]# dos2unix libtool
dos2unix: converting file libtool to Unix format ...
libcrypto.a(dso_dlfcn.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5'
add -ldl
missing: line 81: aclocal-1.15: command not found
当前文件夹,执行autoreconf -vfi
can not be used when making a shared object; recompile with -fPIC
解决方案1 生成Makefile 时 添加 CXXFLAGS="-fPIC"
./configure --prefix=$(pwd)/release --enable-shared --enable-static CXXFLAGS="-fPIC"
解决方案2:
直接在Makefile CFLAGS 中添加 -fPIC
重新 make
无法加载 so dlerror() 提示 Undefined reference to protobuf 库函数无法找到 _ZNK6google8protobuf11MessageLite25InitializationErrorStringB5Ev
查看一下,只有类似下面的,明显 多了 cxx11
_ZNK6google8protobuf11MessageLite25InitializationErrorStringB5cxx11Ev
网上找到:
由于GCC 5.1
以后,GCC默认使用新的C++ ABI
和libstdc++
,它与ECW SDK
二进制文件不兼容(至少当前如此)。解决的办法是使用CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0"
选项去构建GDAL
。
./configure CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0"
注意:如果你还使用别的使用新的C++ ABI
的库(例如:likbml,podofo,poppler,cryptopp等,这通常来自发行版自带的),则这个方法无法正常使用。如果你必须使用这些库,你必须找到它们的源码,并使用CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0"
选项重新编译。
主要是同样的代码使用gcc和版本配置不一样导致。
caffe Makefile中修改CXXFLAGS += -MMD -MP为CXXFLAGS += -MMD -MP -D_GLIBCXX_USE_CXX11_ABI=0。
///
重新
./configure --prefix=$(pwd)/../libs CXXFLAGS="-fPIC -D_GLIBCXX_USE_CXX11_ABI=0"
make 拿到 .a问题,重新 编译,问题未重现。