Я пытаюсь создать свою собственную библиотеку, которая использует другие библиотеки.Я хотел бы распространять свою библиотеку среди клиентов, не требуя от них установки каких-либо зависимостей или других библиотек, и, следовательно, необходимо связывать статические библиотеки с моей собственной библиотекой.Я использую libncnn.a
(который можно найти по следующей ссылке: https://github.com/Tencent/ncnn). Для моего API я упростил вещи ради примера.
В приведенном ниже примере ясоздание библиотеки libmyapi.a
, которая связывает статическую библиотеку libncnn.a
(libmyapi.a
представляет библиотеку / API, которую я передам клиенту).
Затем я пытаюсь связать исполняемый файл с libmyapi.a
(для симуляции клиента с использованием моей библиотеки / API) и использования функции в myapi
, которая создает экземпляр класса, определенного в libncnn.a
. Однако я получаю следующую ошибку:
[ 25%] Building CXX object CMakeFiles/myapi.dir/src/myapi.cpp.o
[ 50%] Linking CXX static library libmyapi.a
[ 50%] Built target myapi
Scanning dependencies of target myexe
[ 75%] Building CXX object CMakeFiles/myexe.dir/main.cpp.o
[100%] Linking CXX executable myexe
/home/nchafni/Cyrus/ncnn-test/ncnn-build/libmyapi.a(myapi.cpp.o): In function `MyApi::myFunc()':
myapi.cpp:(.text+0x23): undefined reference to `ncnn::Net::Net()'
myapi.cpp:(.text+0x2f): undefined reference to `ncnn::Net::~Net()'
collect2: error: ld returned 1 exit status
CMakeFiles/myexe.dir/build.make:83: recipe for target 'myexe' failed
make[2]: *** [myexe] Error 1
CMakeFiles/Makefile2:109: recipe for target 'CMakeFiles/myexe.dir/all' failed
make[1]: *** [CMakeFiles/myexe.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
Это указывает на то, что libncnn.a
не был правильно связан как статическая библиотека в libmyapi.a
. Поэтому мне интересно, не делаю ли я что-то не так с шагом связывания?
Еще раз, я хочу иметьlibncnn.a
объектные файлы, содержащиеся в libmyapi.a
, так что моему исполняемому файлу, использующему libmyapi.a
, не нужно напрямую связывать libncnn.a
.
Структура моего проекта следующая:
.
├── CMakeCache.txt
├── cmake_install.cmake
├── CMakeLists.txt
├── include
│ ├── myapi.h
│ └── ncnn
│ ├── allocator.h
│ ├── benchmark.h
│ ├── blob.h
│ ├── command.h
│ ├── cpu.h
│ ├── gpu.h
│ ├── layer.h
│ ├── layer_type_enum.h
│ ├── layer_type.h
│ ├── mat.h
│ ├── modelbin.h
│ ├── net.h
│ ├── opencv.h
│ ├── paramdict.h
│ ├── pipeline.h
│ └── platform.h
├── lib
│ └── libncnn.a
├── libmyapi.a
├── main.cpp
├── Makefile
└── src
└── myapi.cpp
файл myapi.h:
#ifndef __MYAPI_H__
#define __MYAPI_H__
class MyApi {
public:
void myFunc();
};
#endif
файл myapi.cpp:
#include "../include/myapi.h"
#include "../include/ncnn/net.h"
#include <iostream>
void MyApi::myFunc() {
ncnn::Net();
std::cout << "We were able to create an ncnn Net\n";
}
файл main.cpp:
#include "include/myapi.h"
int main(){
MyApi myapi;
myapi.myFunc();
return 0;
}
И, наконец, CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(myapi)
set(CMAKE_CXX_STANDARD 14)
add_library(ncnn STATIC IMPORTED)
set_target_properties(ncnn PROPERTIES
IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/lib/libncnn.a"
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include/ncnn")
link_directories(${CMAKE_CURRENT_LIST_DIR})
find_package(OpenMP REQUIRED)
add_library(myapi src/myapi.cpp)
target_link_libraries(myapi ncnn ${OpenMP_CXX_LIBRARIES})
add_executable(myexe main.cpp)
target_link_libraries(myexe libmyapi.a)
Редактировать
Как упоминалось в комментариях, изменение target_link_libraries(myexe libmyapi.a)
на target_link_libraries(myexe myapi)
исправило ошибку для меня.
Однако, когда я связал свою библиотеку libmyapi.a
из другого проекта с CMakeLists.txt
, который не связывает libncnn.a
, я получаю ту же ошибку.