【发布时间】:2020-11-20 09:31:00
【问题描述】:
在阅读了一些关于静态库和共享库的文章后,我想我知道其中的区别,但我仍然无法找到解决我的用例的方法。我有以下项目结构
Project
├── A
│ ├── A.cpp
│ ├── A.h
│ └── CMakeLists.txt
├── B
│ ├── CMakeLists.txt
│ └── B.cpp
├── CMakeLists.txt
在文件夹A 我有:
//content of A.h
#include <opencv2/opencv.hpp>
cv::Mat A_load_image(std::string file_path);
//content of A.cpp
#include "A.h"
cv::Mat A_load_image(std::string file_path) {
return cv::imread(file_path);
}
// content of CMakelists.txt in A
set(TARGET A)
add_library( ${TARGET} STATIC A.cpp )
target_include_directories(${TARGET} PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
/path/to/opencv/include/folder )
link_directories( /path/to/opencv/lib/folder)
target_link_libraries( ${TARGET} PUBLIC libopencv_core.a )
然后在我的文件夹B 我有:
//content of B.cpp
#include "A.h"
cv::Mat B_load_image() {
return A_load_image("img.bmp");
}
// content of CMakelists.txt in B
set(TARGET B)
add_library(A STATIC IMPORTED)
set_target_properties(A PROPERTIES IMPORTED_LOCATION /PATH/TO/libA.a)
add_library(${TARGET} SHARED B.cpp)
target_include_directories(${TARGET} PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/../A
/path/to/opencv/include/folder )
target_link_libraries(${TARGET} PUBLIC A libopencv_core.a)
当然我在项目根目录中有 CMakelists.txt 文件:
cmake_minimum_required(VERSION 3.4.1)
add_subdirectory(B)
add_subdirectory(A)
我对这个项目有以下疑问。
- 如何告诉 cmake 先编译 B,这样当我为 A 导入 B 时,如果有任何变化,它已经更新了
- 上述设置不起作用,因为我在链接 B 时出错:“找不到 -lopencv_core”,我已经使用 PUBLIC 链接 A,我还尝试将
link_directories( /path/to/opencv/lib/folder)添加到B的 CMakelists.txt 中,但仍然无法正常工作。 我相信“找不到-lopencv_core”失败了,因为它正在寻找动态库,例如libopencv_core.so而不是静态库。但是为什么会这样以及我如何强制链接到静态库?
【问题讨论】:
-
我不明白你,你为什么这么难?您是否在关注任何 cmake 文档?就像docs.opencv.org/2.4/doc/tutorials/introduction/linux_gcc_cmake/… 一样,说明如何 find_package opencv。目标属性在 cmake 中是传递的,你不需要在每个目标上重复自己添加相同的库和目录。
-
@KamilCuk 只是一个例子。 B来自使用opencv的其他人,我正在基于B构建A。我知道如何链接到opencv,我只是不知道如何将我的共享库链接到链接到opencv的静态库
-
@KamilCuk 我想我有它但它不起作用,这就是我问它的原因......
-
所以也许你想要这个:stackoverflow.com/questions/11429055/…? IE。
A是一个静态库,您想从中创建一个共享库吗?How to tell cmake to compile B first so that when I import B for Aadd_dependencies(B A)。 Ooooch 我想我知道你在尝试做什么,但是为了什么?为什么add_library(A STATIC IMPORTED)只是与A链接。