我正在尝试建立自己的利用其他图书馆的图书馆。我想将我的库分发给客户端,而不需要他们安装任何依赖项或其他库,因此需要将静态库链接到我自己的库中。我正在使用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}}时,会出现相同的错误。