[英]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)
我對這個項目有以下疑問。
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.