Невозможно связать статическую библиотеку с собственной библиотекой с помощью cmake - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь создать свою собственную библиотеку, которая использует другие библиотеки.Я хотел бы распространять свою библиотеку среди клиентов, не требуя от них установки каких-либо зависимостей или других библиотек, и, следовательно, необходимо связывать статические библиотеки с моей собственной библиотекой.Я использую 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, я получаю ту же ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...