0
点赞
收藏
分享

微信扫一扫

56、Windows10+MinGW32+Clion+Tengine lite 编译及其使用


基本思想:使用MInGW32编译Tengine,并使用Clion调用

一、下载OAID Tengine的源代码

git clone https://github.com/OAID/Tengine.git

然后使用CMake-GUI进行编译

56、Windows10+MinGW32+Clion+Tengine lite 编译及其使用_git

 编译完成之后,然后使用mingw32-make进行编译

命令行

D:\Tengine\buildMinGW>cmake -G"MinGW Makefiles" -DOpenCV_DIR="D:\Opencv440\buildMinGW\install" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -DTENGINE_ARCH_X86_AVX=OFF -DTENGINE_ONLINE_REPORT=OFF -DTENGINE_BUILD_EXAMPLES=OFF ..

三、编译遇到的第一个错误

(1)、缺少dlfcn.h头文件

56、Windows10+MinGW32+Clion+Tengine lite 编译及其使用_#include_02


 解决办法

F:\>git clone https://github.com/dlfcn-win32/dlfcn-win32
Cloning into 'dlfcn-win32'...
remote: Enumerating objects: 671, done.
remote: Counting objects: 100% (94/94), done.
remote: Compressing objects: 100% (60/60), done.R
Receiving objects: 96% (645/
Receiving objects: 100% (671/671), 198.23 KiB | 724.00 KiB/s, done.
Resolving deltas: 100% (348/348), done.

F:\>cd dlfcn-win32

F:\dlfcn-win32>mkdir buildMinGW

F:\dlfcn-win32>cd buildMinGW

F:\dlfcn-win32\buildMinGW>cmake -G"MinGW Makefiles" -DBUILD_SHARED_LIBS=OFF ..

F:\dlfcn-win32\buildMinGW>mingw32-make -j8
Scanning dependencies of target dl
[ 50%] Building C object src/CMakeFiles/dl.dir/dlfcn.c.obj
[100%] Linking C static library ..\lib\libdl.a
[100%] Built target dl


F:\dlfcn-win32\buildMinGW>mingw32-make install
[100%] Built target dl
Install the project...
-- Install configuration: "Release"
-- Installing: F:/dlfcn-win32/buildMinGW/include/dlfcn.h
-- Installing: F:/dlfcn-win32/buildMinGW/share/dlfcn-win32/dlfcn-win32-targets.cmake
-- Installing: F:/dlfcn-win32/buildMinGW/share/dlfcn-win32/dlfcn-win32-targets-release.cmake
-- Installing: F:/dlfcn-win32/buildMinGW/share/dlfcn-win32/dlfcn-win32-config.cmake

 解决办法 然后将生成的头文件和静态库拷贝到mingw32的文件夹中 dlfcn.h dlfcn.a

D:\x86_64-8.1.0-release-posix-seh-rt_v6-rev0\mingw64\x86_64-w64-mingw32\include
D:\x86_64-8.1.0-release-posix-seh-rt_v6-rev0\mingw64\x86_64-w64-mingw32\lib

生成库文件目录

D:\dlfcn-win32\buildMinGW\include
D:\dlfcn-win32\buildMinGW\lib

也可以拷贝到这里(我都复制了一下头文件和编译的静态库文件)

D:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\include
D:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\lib

然后接着编译

(2)、编译mkdir存在错误

56、Windows10+MinGW32+Clion+Tengine lite 编译及其使用_git_03

然后接着解决 修改代码cpu_dump.c 源代码为

#ifdef _MSC_VER
CreateDirectoryA(save_dir, NULL);

#else
int ret = mkdir(save_dir, S_IRWXU | S_IRGRP | S_IWGRP | S_IROTH);
// if (0 != ret)
// {
// TLOG_WARNING("Tengine: Create saving folder failed(%d), skip dump.\n", ret);
// return;
// }
#endif

 解决办法 修改代码 添加支持mingw32

#ifdef _MSC_VER
CreateDirectoryA(save_dir, NULL);

#elif __MINGW32__ || __GNUC__
int ret = _mkdir(save_dir, S_IRWXU | S_IRGRP | S_IWGRP | S_IROTH);
#else
int ret = mkdir(save_dir, S_IRWXU | S_IRGRP | S_IWGRP | S_IROTH);
// if (0 != ret)
// {
// TLOG_WARNING("Tengine: Create saving folder failed(%d), skip dump.\n", ret);
// return;
// }
#endif

编译过程中,又遇到一个错误

(3)、编译avx存在编译错误

56、Windows10+MinGW32+Clion+Tengine lite 编译及其使用_#endif_04

 解决办法 需要在cmake过程中,将avx关闭

56、Windows10+MinGW32+Clion+Tengine lite 编译及其使用_#ifdef_05

 (4)缺少文件sys/mman.h:

56、Windows10+MinGW32+Clion+Tengine lite 编译及其使用_#endif_06

 解决办法修改文件 F:\Tengine\source\serializer\tmfile\tm2_serializer.c

源文件

#ifdef _MSC_VER
#include <io.h>
#else
#include <unistd.h>
#include <sys/mman.h>
#endif

修改之后

#ifdef _MSC_VER
#include <io.h>
#elif __MINGW32__ || __GNUC__
#include <io.h>
#else
#include <unistd.h>
#include <sys/mman.h>
#endif

(5)又缺少文件 sys/syscall.h

56、Windows10+MinGW32+Clion+Tengine lite 编译及其使用_#include_07

 这个地方不知道改的对不对,及时不改,好像是可以生成静态库和动态库的 F:\Tengine\source\system\cpu.c

源文件

#ifndef _MSC_VER
#include <pthread.h>
#include <sys/syscall.h>
#include <sched.h>
#include <unistd.h>
#endif

目的文件

#ifndef _MSC_VER
#include <pthread.h>
#elif __MINGW32__ || __GNUC__
#else
#include <sys/syscall.h>
#include <sched.h>
#include <unistd.h>
#endif

源文件232行

#ifdef __APPLE__
uint64_t tid64;
pthread_threadid_np(NULL, &tid64);
pid_t pid = (pid_t)tid64;
#else
pid_t pid = gettid();
#endif
#endif
#endif
cpu_set_t mask;
CPU_ZERO(&mask);
// for (int i = 0; i < ( int )sizeof(size_t) * 8; i++)
for (int i = 0; i < core_count; i++)
{
if (thread_affinity_mask & (1 << i))
CPU_SET(i, &mask);
}
#if __APPLE__
int syscallret = syscall(set_sched_affinity, pid, sizeof(mask), &mask);
#elif __MINGW32__ || __GNUC__
int syscallret = 0;
#endif

if (syscallret)
{
fprintf(stderr, "syscall error %d\n", syscallret);
return -1;
}

return 0;
}
#endif

目的文件

#ifdef __APPLE__
uint64_t tid64;
pthread_threadid_np(NULL, &tid64);
pid_t pid = (pid_t)tid64;
#elif __MINGW32__ || __GNUC__
pid_t pid = getpid();
#else
pid_t pid = gettid();
#endif
#endif
#endif
cpu_set_t mask;
CPU_ZERO(&mask);
// for (int i = 0; i < ( int )sizeof(size_t) * 8; i++)
for (int i = 0; i < core_count; i++)
{
if (thread_affinity_mask & (1 << i))
CPU_SET(i, &mask);
}
#if __APPLE__
int syscallret = syscall(set_sched_affinity, pid, sizeof(mask), &mask);
#elif __MINGW32__ || __GNUC__
int syscallret = 0;
#else
int syscallret = syscall(__NR_sched_setaffinity, pid, sizeof(mask), &mask);
#endif

if (syscallret)
{
fprintf(stderr, "syscall error %d\n", syscallret);
return -1;
}

return 0;
}
#endif

然后就编译成功了,测试一下(注意把tengine 的在线功能和example编译选项都关闭掉)

[ 99%] Linking C shared library libtengine-lite.dll
[ 99%] Built target tengine-lite
Scanning dependencies of target tm_benchmark
[ 99%] Building CXX object benchmark/CMakeFiles/tm_benchmark.dir/common/timer.cc.obj
[ 99%] Building CXX object benchmark/CMakeFiles/tm_benchmark.dir/tm_benchmark.cc.obj
[100%] Linking CXX executable tm_benchmark.exe
[100%] Built target tm_benchmark

D:\Tengine\buildMinGW>mingw32-make install
[ 50%] Built target tengine-lite-static
[ 99%] Built target tengine-lite
[100%] Built target tm_benchmark
Install the project...
-- Install configuration: "Release"
-- Installing: D:/Tengine/buildMinGW/install/lib/libtengine-lite-static.a
-- Installing: D:/Tengine/buildMinGW/install/lib/libtengine-lite.dll.a
-- Installing: D:/Tengine/buildMinGW/install/lib/libtengine-lite.dll
-- Installing: D:/Tengine/buildMinGW/install/include/tengine/c_api.h
-- Installing: D:/Tengine/buildMinGW/install/include/tengine/defines.h

cmakelists.txt文件

cmake_minimum_required(VERSION 3.16)
project(teningeDemo)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
set(CMAKE_CXX_STANDARD 14)
set(OpenCV_DIR "D:\\Opencv453\\buildMinGW")#改为mingw-bulid的位置
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
find_package(OpenCV REQUIRED)

include_directories(${CMAKE_SOURCE_DIR}/include)
include_directories(${CMAKE_SOURCE_DIR}/include/common) # 已经导入include文件中


add_library(libtengine-lite-static STATIC IMPORTED)
set_target_properties(libtengine-lite-static PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/lib/libtengine-lite-static.a)

add_executable(teningeDemo main.cpp)

target_link_libraries(teningeDemo ${OpenCV_LIBS} libtengine-lite-static)

源代码就不放了

56、Windows10+MinGW32+Clion+Tengine lite 编译及其使用_#endif_08

举报

相关推荐

0 条评论