如何强制 CMake 使用系统上安装的特殊版本的 Protobuf?

Posted

技术标签:

【中文标题】如何强制 CMake 使用系统上安装的特殊版本的 Protobuf?【英文标题】:How to force CMake to use a special version of Protobuf installed on system? 【发布时间】:2021-01-06 21:48:39 【问题描述】:

我想将Protobuf_INCLUDE_DIRS 设置为我选择的目录,但是我不知道该怎么做。

$ locate FindProtobuf.cmake
/usr/share/cmake-3.16/Modules/FindProtobuf.cmake

我可以看到在FindProtobuf.cmake,我们有这些:

if(Protobuf_FOUND)
    set(Protobuf_INCLUDE_DIRS $Protobuf_INCLUDE_DIR)
endif()

我希望这里设置为第二个选项:

$ which -a protoc
/home/mona/anaconda3/bin/protoc
/usr/local/bin/protoc

然而,它被设置为第一个选项/home/mona/anaconda3/bin/protoc,尽管在 ~/.bashrc 中强制它为第二个选项:/usr/local/bin/protoc,使用以下命令:alias protoc=/usr/local/bin/protoc

我的程序需要的版本是 3.6.1,别名 protoc=/usr/local/bin/protoc 保证了这一点。但是,ProtobufCMake 强制路径为 /home/mona/anaconda3/bin/protoc 并且该版本为 3.13.0。

关于我面临的问题。我正在使用 openpose 并在 Ubuntu 20.04 中安装它,我使用的是 CMake。它要求 protobuf 版本为 3.6.1。

更多信息在这里https://github.com/CMU-Perceptual-Computing-Lab/openpose/issues/1817

以下是消息:

CMake Error at /usr/share/cmake-3.16/Modules/FindProtobuf.cmake:469 (file):
  file STRINGS file "/usr/include/google/protobuf/stubs/common.h" cannot be
  read.
Call Stack (most recent call first):
  CMakeLists.txt:429 (find_package)


CMake Error at /usr/share/cmake-3.16/Modules/FindProtobuf.cmake:475 (math):
  math cannot parse the expression: " / 1000000": syntax error, unexpected
  exp_DIVIDE (2).
Call Stack (most recent call first):
  CMakeLists.txt:429 (find_package)


CMake Error at /usr/share/cmake-3.16/Modules/FindProtobuf.cmake:476 (math):
  math cannot parse the expression: " / 1000 % 1000": syntax error,
  unexpected exp_DIVIDE (2).
Call Stack (most recent call first):
  CMakeLists.txt:429 (find_package)


CMake Error at /usr/share/cmake-3.16/Modules/FindProtobuf.cmake:477 (math):
  math cannot parse the expression: " % 1000": syntax error, unexpected
  exp_MOD (2).
Call Stack (most recent call first):
  CMakeLists.txt:429 (find_package)


CMake Warning at /usr/share/cmake-3.16/Modules/FindProtobuf.cmake:499 (message):
  Protobuf compiler version 3.13.0 doesn't match library version
  ERROR.ERROR.ERROR
Call Stack (most recent call first):
  CMakeLists.txt:429 (find_package)

【问题讨论】:

【参考方案1】:

不知道我想在上面做什么,但是让 CMake 为 OpenPose 工作的一个技巧是使用 Python venv 并在 ~/.bashrc 中注释 anaconda python 激活行:

现在,cmake-gui .. 不会抛出错误:

GCC detected, adding compile flags
GCC detected, adding compile flags
Building with CUDA.
CUDA detected: 10.1
Added CUDA NVCC flags for: sm_75
cuDNN not found
Found gflags  (include: /usr/include, library: /usr/lib/x86_64-linux-gnu/libgflags.so)
Found glog    (include: /usr/include, library: /usr/lib/x86_64-linux-gnu/libglog.so)
Caffe will be downloaded from source now. NOTE: This process might take several minutes depending
        on your internet connection.
Caffe has already been downloaded.
HEAD is now at 1807aada Added Ampere arch's (CUDA11)

Caffe will be built from source now.
Download the models.
Downloading BODY_25 model...
Model already exists.
Not downloading body (COCO) model
Not downloading body (MPI) model
Downloading face model...
Model already exists.
Downloading hand model...
Model already exists.
Models Downloaded.
Configuring done

我在 ~/.bashrc 中有这个:

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
##__conda_setup="$('/home/mona/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
##if [ $? -eq 0 ]; then
##    eval "$__conda_setup"
##else
##    if [ -f "/home/mona/anaconda3/etc/profile.d/conda.sh" ]; then
##        . "/home/mona/anaconda3/etc/profile.d/conda.sh"
##    else
##        export PATH="/home/mona/anaconda3/bin:$PATH"
##    fi
##fi

并在 Ubuntu 20.04 中安装了以下内容:

$ sudo apt-get install python3
$ sudo apt-get install python3-venv

另外,在 ~/.bashrc 中执行此操作并获取它:alias python=python3

$ python -m venv ~/venv/openpose
$ source ~/venv/openpose/bin/activate

【讨论】:

以上是关于如何强制 CMake 使用系统上安装的特殊版本的 Protobuf?的主要内容,如果未能解决你的问题,请参考以下文章

如何方便地强制 CMAKE 使用特定版本的静态库文件?

如何强制 cmake 在没有完整路径的情况下使用 cl.exe?

CMake:如何避免 HDF5 系统和 conda 安装中的不匹配?

如何在编译期间强制犰狳库链接到本地​​ OpenBLAS

如何安装Cmake3.11.3-win32-x86

如何强制 CMake 链接到系统库而不是同名目标