如何针对一个版本的库制作/构建项目,但其依赖项针对该库的不同版本?

问题描述 投票:0回答:1

我的工作区结构如下所示。它涉及

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菜鸟。

c++ cmake makefile dynamic-linking cmakelists-options
1个回答
0
投票
不起作用,放弃吧!

您似乎正在为 UNIX 进行构建。


与 Windows 不同,UNIX 共享库

不是

是独立的——它会受到符号插入和符号冲突的影响。

此外,OpenCV 版本 3.4 和 4.4 定义相同的符号,并且

ABI 兼容。

综合上面的两条语句意味着 如果

你设法将你的项目与 OpenCV 3.4 和 4.4 版本动态链接,你几乎肯定会遇到莫名其妙的崩溃、内存损坏等等。

(如果您尝试将项目与存档版本链接,则很可能会因多个符号定义而失败。)

© www.soinside.com 2019 - 2024. All rights reserved.