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++ ABIlibstdc++,它与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问题,重新 编译,问题未重现。