undefined reference to ‘google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, bool*, bool*)’
产生原因:
如果产生了此问题,通常是忘记在可执行程序中链接gflags。如果经常编译程序,一旦看到undefined reference,就可以大概猜到依赖库出了问题。
尝试解决
如果是使用CMake文件,记的链接gflags库。
根据下面的CMakeLists.txt的示例
cmake_minimum_required(VERSION 2.9)
project(test_glog)
add_executable(test_glog main.cpp)
target_link_libraries(test_glog libgflags.a libglog.a)
修改程序后,make,报下面新的错误:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libgflags.a(gflags.cc.o): undefined reference to symbol 'pthread_rwlock_wrlock@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
发现两次错误都是gflags引起,怀疑是gflags的安装有问题。重新安装后问题undefined reference to `pthread_rwlock_wrlock’ 依然存在
经过查询得到:产生此问题的原因是在编译gflags和glog时,都会默认使用pthread。
解决方法
本问题有两个解决方案,一是直接链接pthread,二是使用gflags的非线程版本的依赖库。
1.链接pthread
find_package(Threads)
add_executable(test_glog main.cpp)
target_link_libraries(test_glog libgflags.a libglog.a ${CMAKE_THREAD_LIBS_INIT})
2.使用非线程版本
add_executable(test_glog main.cpp)
target_link_libraries(test_glog libgflags_nothreads.a libglog.a)
使用方法1报错:
**对‘google::FlagRegisterer::FlagRegisterer(char const*, char const*, )’未定义的引用**片
使用方法2 报错:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libgflags_nothreads.a(gflags.cc.o): undefined reference to symbol 'pthread_rwlock_wrlock@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。所以在编译中要加 -lpthread参数。
通过查找rdynamic关键字找到文件/build/CMakeFiles/trt-yolo-app.dir/link.txt,并在最后添加了-lpthread,重新make后,出现方法1中错误
对‘google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, unsigned long*, unsigned long*)’未定义的引用
解决思路:
基本确定了问题是在CMakeLists.txt 中没有正确地导入gflags。找不到gflags导致的错误。因此,需要找到正确的在cmake中用gflags的方法。
查到要请求链接的特定导入gflags库目标,请使用find_package命令的选项。
参考以下链接:
gflags使用测试: https://blog.csdn.net/u012526003/article/details/52348201
在CMakeLists.txt加入:
find_package(gflags REQUIRED)
target_link_libraries(trt-yolo-app yolo-lib gflags)
make成功!!!
make以及make install成功后执行程序出现如下错误:
trt-yolo-app: error while loading shared libraries: libgflags.so.2.2: cannot open shared object file
发现问题是重新装了gflags,但是没有重装依赖gflags的glog,重装glog就行了。补上经过验证的gflags与glog的安装步骤:
1)安装 GFlags
运行如下指令
git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build && cd build
cmake … -DBUILD_SHARED_LIBS=ON
make -j4
sudo make install
2)安装 GLog:
安装编译工具:
sudo apt-get install autoconf automake libtool
运行如下指令安装:
git clone https://github.com/google/glog
./autogen.sh
./configure CPPFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib"
make -j8
sudo make install