簡體   English   中英

在 cmake 中設置共享和 static 庫之間的鏈接

[英]Setup linking between shared and static lib in cmake

在閱讀了一些關於 static 和共享庫的文章后,我想我知道其中的區別,但我仍然無法找到解決我的用例的方法。 我有以下項目結構

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)

我對這個項目有以下疑問。

  1. 如何告訴 cmake 先編譯 B,這樣當我為 A 導入 B 時,如果有任何更改,它已經更新
  2. 上述設置不起作用,因為鏈接 B 時出現錯誤:“找不到 -lopencv_core”,我已經使用 PUBLIC 鏈接 A,我還嘗試將link_directories( /path/to/opencv/lib/folder)添加到 CMakelists .txt 為B ,但仍然無法正常工作。 我相信“找不到 -lopencv_core”失敗了,因為它正在尋找動態庫,例如libopencv_core.so而不是 static 之一。 但是為什么會這樣以及我如何強制鏈接到 static 庫?

試試 object 庫:

cmake_minimum_required(VERSION 3.11)
add_subdirectory(A)
add_subdirectory(B)

# A/CMakeLists.txt
find_package(OpenCV REQUIRED)
add_library(A OBJECT A.cpp)
target_include_directories(A PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(A PUBLIC ${OpenCV_LIBS})

# B/CMakeLists.txt
add_library(B SHARED B.cpp)
target_include_directories(B PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(B PUBLIC A)
# also try
target_link_options(B PRIVATE "-Wl,--whole-archive")
# or maybe
target_link_options(B PRIVATE "-Wl,--export-all-symbols")
# or maybe also
target_sources(B $<TARGET_OBJECTS:A>)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM