undefined reference to ‘google::FlagRegisterer::FlagRegisterer

undefined reference to ‘google::FlagRegisterer::FlagRegisterer以及undefined reference to `pthread_rwlock_wrlock’错误解决

  • C++程序camke通过,make时报google::FlagRegisterer错误
    • undefined reference to `pthread_rwlock_wrlock’
    • 最终解决办法
    • 补充

C++程序camke通过,make时报google::FlagRegisterer错误

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’ 依然存在

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

你可能感兴趣的:(undefined reference to ‘google::FlagRegisterer::FlagRegisterer)