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

问题描述

我想将 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)

解决方法

不确定如何准确地完成我上面想做的事情,但是让 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...