无法使用cmake将静态库链接到自己的库

时间:2019-06-19 22:04:15

标签: c++ cmake linker static-libraries

我正在尝试建立自己的利用其他图书馆的图书馆。我想将我的库分发给客户端,而不需要他们安装任何依赖项或其他库,因此需要将静态库链接到我自己的库中。我正在使用libncnn.a(可以在以下链接中找到:https://github.com/Tencent/ncnn)。对于我的API,为简化示例,我简化了操作。

在下面的示例中,我正在创建一个链接libmyapi.a静态库的libncnn.a库(libmyapi.a代表我将分发给客户端的库/api)。

然后,我尝试针对libmyapi.a链接可执行文件(以使用我的库/ api模拟客户端),并利用myapi中的函数来创建{中定义的类的实例{1}}。但是,出现以下错误:

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

myapi.h文件:

.
├── 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.cpp文件:

#ifndef __MYAPI_H__
#define __MYAPI_H__

class MyApi {
public:
    void myFunc();
};

#endif


main.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";
}

最后是CMakeLists.txt

#include "include/myapi.h"

int main(){

    MyApi myapi;
    myapi.myFunc();

    return 0;
}

编辑

如评论中所述,将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的{​​{1}}时,会出现相同的错误。

0 个答案:

没有答案