我的工作区结构如下所示。它涉及
PROJ
代表项目、TPL
代表第三方库和 DEP-PROJ
代表依赖项目(以及 ws
代表工作区)。我还在它们旁边的括号内指定了它们的依赖关系。
ws
├── opencv34
│ ├── opencv
│ └── opencv_contrib
├── opencv44
| ├── opencv
| └── opencv_contrib
├── DEP-PROJ (opencv 3.4)
└── PROJ (DEP-PROJ, opencv 4.4)
└── TPL (opencv 4.4)
我已经使用
cmake ..
和 make -j6
命令构建了两个版本的 opencv。但没有跑make install
。
接下来,
DEP-PROJ
在其CMakeLists.txt中有以下几行(注意OPENCV3_DIR
):
set(OpenCV_DIR $ENV{OPENCV3_DIR})
find_package(OpenCV 3.4 REQUIRED)
在
cmake
目录中执行 DEP-PROJ/build
之前,我运行 export OPENCV3_DIR=/ws/opencv34/opencv/build
,这样 cmake
就会成功。
接下来,
PROJ
在其CMakeLists.txt中有以下几行(注意OPENCV4_DIR
):
set(OpenCV_DIR $ENV{OPENCV4_DIR})
find_package(OpenCV 4.4 REQUIRED)
接下来,在
cmake
目录中执行 PROJ/build
之前,我运行 export OPENCV4_DIR=/ws/opencv34/opencv/build
,这样 cmake
就会成功。
在
cmake
目录中执行 PROJ/build
之前,我运行 export OPENCV4_DIR=/ws/opencv44/opencv/build
,这样 cmake
就会成功。
这会导致 cmake 成功,但 make 失败并出现错误:
fatal error: opencv/cv.h: No such file or directory
看起来在
PROJ
内部进行make会重建DEP-PROJ
。但是,PROJ
的CMakeLists.txt将OpenCV_DIR
设置为opencv44
目录。这使得 DEP-PROJ
构建失败并给出上述错误。
为了避免这种情况,我在
make install
内运行 /ws/opencv34/opencv/build
。这让 DEP-PROJ
从 /usr
目录中找到 opencv 3.4,并从 PROJ
目录中引用 opencv 4.4,从而成功构建 /ws/opencv44/opencv/build
。但是,我觉得解决这个问题的方法有点hacky(在opencv 3.4中执行PROJ
,而不是在opencv 4.4中执行)。执行此操作的正确方法是什么?如何在构建
make install
时避免重建 DEP-PROJ
?或者针对PROJ
(而不是/ws/opencv34/opencv/build
中的opencv)构建它,同时针对/usr
构建PROJ
?PS:我是cmake菜鸟。
您似乎正在为 UNIX 进行构建。
不是
是独立的——它会受到符号插入和符号冲突的影响。此外,OpenCV 版本 3.4 和 4.4 定义相同的符号,并且不
ABI 兼容。综合上面的两条语句意味着 如果
你设法将你的项目与 OpenCV 3.4 和 4.4 版本动态链接,你几乎肯定会遇到莫名其妙的崩溃、内存损坏等等。(如果您尝试将项目与存档版本链接,则很可能会因多个符号定义而失败。)