I'm trying to solve an issue for two days straight now and I've searched for answer but didn't find something that helped my specific case. I inherited a Visual Studio 2008 project that creates a dll that includes some Win v7.1A SDK .libs (odbc32, odbccp32,
setupapi). I want to make it a CMake project (because the project will need to be cross platform in the future) but It doesn't work. I can create a .lib file but I can't create a dll. I tried to use vcproj2cmake but it overly complicates to CMake file so I
only took some of the stuff in it, I also added ideas from related questions and answers. I'm attaching my CMake, my msvc build cmd, and the error output. I checked and CMake finds all the .libs listed.
If anyone can point me in the right direction that'll be great. Thanks in advance!
Heres my CMakeLists.txt:
cmake_minimum_required(VERSION 3.2)
project(MyProj)
set(LIB_TYPE DLL)
set(OUTPUT_DIRECTORY ../BIN)
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")
if (MSVC)
set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
)
foreach(CompilerFlag ${CompilerFlags})
if(${LIB_TYPE} STREQUAL "DLL")
string(REPLACE "/MT" "/MD" ${CompilerFlag} "${${CompilerFlag}}")
elseif(${LIB_TYPE} STREQUAL "STAT")
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
endif()
endforeach()
# SET (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
SET (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NODEFAULTLIB:LIBCMTD /DEF:MyProjDLL/MyProj.def")
SET (CMAKE_STATIC_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NODEFAULTLIB:MSVCRTD /DEF:MyProjDLL/MyProj.def")
# SET (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
endif()
set(SOURCE
MyProjDLL/source/MyProj.c
)
include_directories(
MyProjDLL/header
./include
)
#WIN SDK LIBS
link_directories(
"C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib/x64"
)
find_library(ODBC32 odbc32 "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib/x64")
find_library(ODBCCP32 odbccp32 "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib/x64")
find_library(SETUP_API setupapi "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib/x64")
MESSAGE( STATUS "ODBC32: " ${ODBC32} )
MESSAGE( STATUS "ODBCCP32: " ${ODBCCP32} )
MESSAGE( STATUS "SETUP_API: " ${SETUP_API} )
set(LINK_LIBS
${ODBC32} ${ODBCCP32} ${SETUP_API} kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
)
if(${LIB_TYPE} STREQUAL "DLL")
add_library(MyProj SHARED ${SOURCE})
target_link_libraries(MyProj ${LINK_LIBS})
elseif(${LIB_TYPE} STREQUAL "STAT")
add_library(MyProj STATIC ${SOURCE})
target_link_libraries(MyProj ${LINK_LIBS})
endif()
#target_link_libraries(MyProj PUBLIC ${SETUP_API})
#target_link_libraries(MyProj PRIVATE ${ODBC32})
#target_link_libraries(MyProj PRIVATE ${ODBCCP32})
if(TARGET MyProj)
set_property(TARGET MyProj APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG
MyProj_EXPORTS
WIN32
_DEBUG
_USRDLL
_WINDOWS
)
endif(TARGET MyProj)
Here's my msbuild cmd:
msbuild /tv:12.0 /p:Configuration=Debug /p:Platform=Win32 /consoleloggerparameters:summary /verbosity:minimal MyProj.sln
And Here are some of the errors (I have about 45..):
MyProj.obj : error LNK2019: unresolved external symbol __imp__CreateFileA@28 referenced in function _AttachDriver
MyProj.obj : error LNK2019: unresolved external symbol __imp__ReadFile@20 referenced in function _PostReceive
MyProj.obj : error LNK2019: unresolved external symbol __imp__WriteFile@20 referenced in function _DoSend
MyProj.obj : error LNK2019: unresolved external symbol __imp__CloseHandle@4 referenced in function _DoIOCTL
MyProj.obj : error LNK2019: unresolved external symbol __imp__GetLastError@0 referenced in function _HeciCmd@32
MSVCRTD.lib(error.obj) : error LNK2001: unresolved external symbol __imp__GetLastError@0
MSVCRTD.lib(pdblkup.obj) : error LNK2001: unresolved external symbol __imp__GetLastError@0
MyProj.obj : error LNK2019: unresolved external symbol __imp__SetLastError@4 referenced in function _HeciCmd@32
MyProj.obj : error LNK2019: unresolved external symbol __imp__GetOverlappedResult@16 referenced in function _DoIOCTL
MyProj.obj : error LNK2019: unresolved external symbol __imp__DeviceIoControl@32 referenced in function _DoIOCTL
MSVCRTD.lib(error.obj) : error LNK2019: unresolved external symbol __imp__IsDebuggerPresent@0 referenced in function "void __cdecl failwithmessage(void *,int,int,char const *)" (?failwithmessage@@YAXPAXHHPBD@Z)
MSVCRTD.lib(gs_report.obj) : error LNK2001: unresolved external symbol __imp__IsDebuggerPresent@0
MSVCRTD.lib(error.obj) : error LNK2019: unresolved external symbol __imp__RaiseException@16 referenced in function "int __cdecl DebuggerProbe(unsigned long)" (?DebuggerProbe@@YAHK@Z)
MSVCRTD.lib(error.obj) : error LNK2019: unresolved external symbol __imp__GetProcAddress@8 referenced in function "void __cdecl _RTC_AllocaFailure(void *,struct _RTC_ALLOCA_NODE *,int)" (?_RTC_AllocaFailure@@YAXPAXPAU_RTC_ALLOCA_NODE@@H@Z)
MSVCRTD.lib(pdblkup.obj) : error LNK2001: unresolved external symbol __imp__GetProcAddress@8
MSVCRTD.lib(error.obj) : error LNK2019: unresolved external symbol __imp__LoadLibraryExW@12 referenced in function "void __cdecl _RTC_AllocaFailure(void *,struct _RTC_ALLOCA_NODE *,int)" (?_RTC_AllocaFailure@@YAXPAXPAU_RTC_ALLOCA_NODE@@H@Z)