Support building shared libraries on WINCE.

This commit is contained in:
Hugo Lindström 2019-08-01 15:28:04 +02:00
parent 4dadf17bd9
commit 03fe1cb7fc
5 changed files with 32 additions and 11 deletions

View File

@ -18,11 +18,17 @@ namespace cv {
extern __declspec(dllimport) bool __termination; // Details: #12750 extern __declspec(dllimport) bool __termination; // Details: #12750
} }
extern "C" #ifdef _WIN32_WCE
BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID lpReserved); #define DLL_MAIN_ARG0 HANDLE
#else
#define DLL_MAIN_ARG0 HINSTANCE
#endif
extern "C" extern "C"
BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID lpReserved) BOOL WINAPI DllMain(DLL_MAIN_ARG0, DWORD fdwReason, LPVOID lpReserved);
extern "C"
BOOL WINAPI DllMain(DLL_MAIN_ARG0, DWORD fdwReason, LPVOID lpReserved)
{ {
if (fdwReason == DLL_THREAD_DETACH || fdwReason == DLL_PROCESS_DETACH) if (fdwReason == DLL_THREAD_DETACH || fdwReason == DLL_PROCESS_DETACH)
{ {

View File

@ -139,7 +139,7 @@ const char dir_separators[] = "/";
static bool isDir(const cv::String& path, DIR* dir) static bool isDir(const cv::String& path, DIR* dir)
{ {
#if defined _WIN32 || defined WINCE #if defined _WIN32 || defined _WIN32_WCE
DWORD attributes; DWORD attributes;
BOOL status = TRUE; BOOL status = TRUE;
if (dir) if (dir)
@ -147,7 +147,7 @@ static bool isDir(const cv::String& path, DIR* dir)
else else
{ {
WIN32_FILE_ATTRIBUTE_DATA all_attrs; WIN32_FILE_ATTRIBUTE_DATA all_attrs;
#ifdef WINRT #if defined WINRT || defined _WIN32_WCE
wchar_t wpath[MAX_PATH]; wchar_t wpath[MAX_PATH];
size_t copied = mbstowcs(wpath, path.c_str(), MAX_PATH); size_t copied = mbstowcs(wpath, path.c_str(), MAX_PATH);
CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1)); CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));

View File

@ -115,13 +115,20 @@ static cv::String getModuleLocation(const void* addr)
#endif #endif
if (m) if (m)
{ {
char path[MAX_PATH]; TCHAR path[MAX_PATH];
const size_t path_size = sizeof(path)/sizeof(*path); const size_t path_size = sizeof(path) / sizeof(*path);
size_t sz = GetModuleFileNameA(m, path, path_size); // no unicode support size_t sz = GetModuleFileName(m, path, path_size);
if (sz > 0 && sz < path_size) if (sz > 0 && sz < path_size)
{ {
path[sz] = '\0'; path[sz] = TCHAR('\0');
#ifdef _UNICODE
char char_path[MAX_PATH];
size_t copied = wcstombs(char_path, path, MAX_PATH);
CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
return cv::String(char_path);
#else
return cv::String(path); return cv::String(path);
#endif
} }
} }
#elif defined(__linux__) #elif defined(__linux__)

View File

@ -3,10 +3,10 @@ if(WINCE)
# Try_Compile succeed and therefore also C/C++ ABI Detetection work # Try_Compile succeed and therefore also C/C++ ABI Detetection work
# https://gitlab.kitware.com/cmake/cmake/blob/master/Modules/Platform/Windows- # https://gitlab.kitware.com/cmake/cmake/blob/master/Modules/Platform/Windows-
# MSVC.cmake # MSVC.cmake
set(CMAKE_C_STANDARD_LIBRARIES_INIT "coredll.lib") set(CMAKE_C_STANDARD_LIBRARIES_INIT "coredll.lib oldnames.lib")
set(CMAKE_CXX_STANDARD_LIBRARIES_INIT ${CMAKE_C_STANDARD_LIBRARIES_INIT}) set(CMAKE_CXX_STANDARD_LIBRARIES_INIT ${CMAKE_C_STANDARD_LIBRARIES_INIT})
foreach(ID EXE SHARED MODULE) foreach(ID EXE SHARED MODULE)
string(APPEND CMAKE_${ID}_LINKER_FLAGS_INIT string(APPEND CMAKE_${ID}_LINKER_FLAGS_INIT
" /NODEFAULTLIB:libc.lib /NODEFAULTLIB:oldnames.lib") " /NODEFAULTLIB:libc.lib")
endforeach() endforeach()
endif() endif()

View File

@ -57,6 +57,14 @@ For headless WEC2013, this configuration may not be limited to but is known to w
-DWITH_TIFF=OFF ` -DWITH_TIFF=OFF `
``` ```
## Configuring to build as shared
Building OpenCV as shared libraries is as easy as appending
```
-DBUILD_SHARED_LIBS=ON `
-DBUILD_ZLIB=ON
```
to the build configuration.
## Building ## Building
You are required to build using Unicode: You are required to build using Unicode:
`cmake --build . -- /p:CharacterSet=Unicode` `cmake --build . -- /p:CharacterSet=Unicode`