GoogleTest compile with MT_StaticRelease errors - c++

How can I force google test compile with /MT option?
I saw that google test tries to compile with MT(internal_utils.cmake line 33):
if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt)
string(REPLACE "/MD" "-MT" ${flag_var} "${${flag_var}}")
endif()
But it doesn't work (BUILD_SHARED_LIBS and gtest_force_shared_crt are disabled).
I gets error when my project compiles with MT:
gtest.lib(gtest-all.obj) : error LNK2038: mismatch detected for
"RuntimeLibrary": value "MD_DynamicRelease" does not match value
"MT_StaticRelease"
And more some LNK2005 and LNK4217.
If I try to compile my project without MT, all compiles ok.
How can I solve it? Thanks in advance!

That if is a test, implementing a switch allowing you to configure it before including googletest.
It's also mentioned in the manual:
Visual Studio Dynamic vs Static Runtimes
By default, new Visual Studio projects link the C runtimes dynamically
but GoogleTest links them statically. This will generate an error that
looks something like the following: gtest.lib(gtest-all.obj) : error
LNK2038: mismatch detected for 'RuntimeLibrary': value
'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in main.obj
GoogleTest already has a CMake option for this: gtest_force_shared_crt
Enabling this option will make gtest link the runtimes dynamically
too, and match the project in which it is included.
So just set it in your project e.g. like this:
set(gtest_force_shared_crt on)
include(FetchContent)
FetchContent_Declare(googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG main)
FetchContent_MakeAvailable(googletest)
enable_testing()

Related

How to use "webrtc.lib" static library in VS 2019 or CLion Project?

I have been working with WebRtc Development for the Windows Platform. I want to develop webrtc based desktop application. I am doing it from scratch for learning and better understanding.
The normal process of WebRtc Library Compilation:
I have initially started with (Getting Started with WinRTC). I followed the normal compilation process. After that, I have tried multiple ways to generate project files for webrtc such as;
1.Default
gn gen --ide=vs2019 out/Default
2.Custom Flags
gn gen --ide=vs2019 out/Default --args="use_rtti=true is_clang=false rtc_build_tools=false rtc_include_tests=false rtc_build_examples=false"
3.Custom Flags
gn gen --ide=vs2019 out\Default --filters=//:webrtc "--args=is_debug=true use_lld=false is_clang=false rtc_include_tests=true rtc_build_tools=true rtc_win_video_capture_winrt=true target_cpu=\"x86\" target_os=\"win\" rtc_build_examples=true rtc_win_use_mf_h264=true enable_libaom=true rtc_enable_protobuf=true"
For the building process, I have Followed these methods:
With command line:
Run the following command to build the patched WebRTC from the command line.
ninja -C out\Default\x64
With Visual Studio 2019:
Open the generated Visual Studio solution with the following command:
devenv out\Default\x64\all.sln
I have tried almost all available combinations to generate build files and to build webrtc.lib static library. I have successfully managed to compile the static webrtc library webrtc.lib for both architectures;
x64 (Default Arch) (For Debug as well as release)
x86 (Custom Arch) (For Debug as well as release)
IMPORTANT:
I have successfully managed to run peerconnection_server.exe and
peerconnection_client.exe on windows. These examples are
successfully running on localhost.
Using VS2019:
After that, I created a new Console based project using VS2019 to consume generated binaries and followed these steps;
Add include folders
Configuration Properties → C/C++ → General → Additional Include Directories and add the following paths:
c:\webrtc\src
c:\webrtc\src\out\Default\$(Configuration)\$(PlatformTarget)\gen
c:\webrtc\src\third_party\abseil-cpp
c:\webrtc\src\third_party\libyuv\include
Preprocessor macros:
Click on Preprocessor → Preprocessor Definitions and add the following definitions:
USE_AURA=1;_HAS_EXCEPTIONS=0;__STD_C;_CRT_RAND_S;_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_DEPRECATE;_ATL_NO_OPENGL;_WINDOWS;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;PSAPI_VERSION=2;WIN32;_SECURE_ATL;WINUWP;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_PC_APP;WIN10=_WIN32_WINNT_WIN10;WIN32_LEAN_AND_MEAN;NOMINMAX;_UNICODE;UNICODE;NTDDI_VERSION=NTDDI_WIN10_RS2;_WIN32_WINNT=0x0A00;WINVER=0x0A00;NDEBUG;NVALGRIND;DYNAMIC_ANNOTATIONS_ENABLED=0;WEBRTC_ENABLE_PROTOBUF=0;WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE;RTC_ENABLE_VP9;HAVE_SCTP;WEBRTC_LIBRARY_IMPL;WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0;WEBRTC_WIN;ABSL_ALLOCATOR_NOTHROW=1;HAVE_SCTP;WEBRTC_VIDEO_CAPTURE_WINRT
Linker additional library path:
Click on Linker → General → Additional Library Directories and add the following path:
c:\webrtc\src\out\Default\$(Configuration)\$(PlatformTarget)\obj
WebRTC library name:
Click on Input → Additional Dependencies and add the following filename:
webrtc.lib
Now, when I simply use this basic implementation such as;
#include <iostream>
#include "rtc_base/thread.h"
#include "rtc_base/logging.h"
#include "rtc_base/ssl_adapter.h"
#include "rtc_base/arraysize.h"
#include "rtc_base/net_helpers.h"
#include "rtc_base/string_utils.h"
#include "rtc_base/signal_thread.h"
int main(int argc, char** argv) {
rtc::InitializeSSL();
return 0;
}
The program is flooded with two types of errors:
1. LNK2038 mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug'
and another one is
2. LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2'
You can also see as given; Here I have used webrtc.lib with Configuration (Release) & Platform (x64).
Using Clion-2021.2.1 and CMAKE:
Here I have used webrtc.lib with Configuration (Release) & Platform (x86).
CMakeLists.txt is given as;
cmake_minimum_required(VERSION 3.20)
project(NewRtc)
set(CMAKE_CXX_STANDARD 14)
#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
#set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
include_directories(
"c:/webrtc/src"
"C:/webrtc/src/out/Default/x86/obj"
"c:/webrtc/src/third_party/abseil-cpp"
"c:/webrtc/src/third_party/libyuv/include"
)
# error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
# Solution:
#1. _ITERATOR_DEBUG_LEVEL = 0 // disabled (for release builds)
#2. _ITERATOR_DEBUG_LEVEL = 1 // enabled (if _SECURE_SCL is defined)
#3. _ITERATOR_DEBUG_LEVEL = 2 // enabled (for debug builds)
add_definitions(
-D_ITERATOR_DEBUG_LEVEL=0
-DUSE_AURA=1
-D_HAS_EXCEPTIONS=0
-D__STD_C
-D_CRT_RAND_S
-D_CRT_SECURE_NO_DEPRECATE
-D_SCL_SECURE_NO_DEPRECATE
-D_ATL_NO_OPENGL
-D_WINDOWS
-DCERT_CHAIN_PARA_HAS_EXTRA_FIELDS
-DPSAPI_VERSION=2
-DWIN32
-D_SECURE_ATL
-DWINUWP
-D__WRL_NO_DEFAULT_LIB__
-DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP
-DWIN10=_WIN32_WINNT_WIN10
-DWIN32_LEAN_AND_MEAN
-DNOMINMAX
-D_UNICODE
-DUNICODE
-DNTDDI_VERSION=NTDDI_WIN10_RS2
-D_WIN32_WINNT=0x0A00
-DWINVER=0x0A00
-DNDEBUG
-DNVALGRIND
-DDYNAMIC_ANNOTATIONS_ENABLED=0
-DWEBRTC_ENABLE_PROTOBUF=0
-DWEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE
-DRTC_ENABLE_VP9
-DHAVE_SCTP
-DWEBRTC_LIBRARY_IMPL
-DWEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0
-DWEBRTC_WIN
-DABSL_ALLOCATOR_NOTHROW=1
-DHAVE_SCTP
-DWEBRTC_VIDEO_CAPTURE_WINRT)
#set(CMAKE_CXX_FLAGS_RELEASE "/MT")
#set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
set(-Dwebrtc.lib)
add_executable(NewRtc main.cpp)
set_property(TARGET NewRtc PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
target_link_libraries(NewRtc
PRIVATE "C:/webrtc/src/out/Default/x86/obj/webrtc.lib"
)
But when I simply build the project, this error comes up for every implementation of WebRtc. Here you can see:
Please assist me that how can I simply use webrtc library in any project on windows suing VS2019 or Clion. I am trying to solve these problems, I have tried multiple solutions over stack overflow and other communities using cmake or adding flags inside project properties such as;
Linker Tool Errors
/MD, /MT, /LD (Use Run-Time Library)
LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2'
Mismatch Detected for 'RuntimeLibrary'
I have tried my best to explain the complete solution and associated problem so that someone might help me accordingly.
Well Guys, After spending almost 12 hours of research, I have made my day. I have exactly figured out what was wrong with my development setup in (VS2019/Clion) of using static webrtc.lib in executable projects.
I must thank Mr.#drescherjm for his support on my question. It's
really appreciated it.
All things were in a positive direction from library compilation to its usage in VS2019/Clion projects. Actually, webrtc development in .netCore projects required some useful libraries for the normal use of webrtc.lib in your projects.
Here is the list of libraries that you must use during development such as;
For Windows:
Required Modules for building WebRtc projects for Windows as follows;
WS2_32 secur32.lib winmm.lib dmoguids.lib wmcodecdspuuid.lib msdmo.lib Strmiids.lib
For Linux:
Required Modules for building WebRtc projects for Linux as follows;
Secur32 Msdmo Winmm Dmoguids wmcodecdspuuid
These are the important libraries as webrtc peer-to-peer communication mostly comes up with the extensive implementation of socket programming in C/C++ for both Linux as well as Windows Operating Systems.
How to use these libraries in projects:
using CmakeLists.txt
using #pragma keyword
For CMakeLists.txt:
You can simply include these modules in target_link_libraries() in which you are also linking webrtc.lib such as;
add_executable(NewRtc main.cpp)
set_property(TARGET NewRtc PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
target_link_libraries(NewRtc
PRIVATE "{$LIB_PATH}/webrtc.lib"
# Required Modules for building projects
WS2_32 secur32.lib winmm.lib dmoguids.lib wmcodecdspuuid.lib msdmo.lib Strmiids.lib
)
For #Pragma Keyword:
You can directly include all the required libraries using the #pragma keyword inside your executable files (in my case main.cpp) such as;
# pragma comment(lib, "webrtc.lib")
# pragma comment(lib,"WS2_32")
# pragma comment(lib, "secur32.lib")
# pragma comment(lib, "winmm.lib")
# pragma comment(lib, "dmoguids.lib")
# pragma comment(lib, "wmcodecdspuuid.lib")
# pragma comment(lib, "msdmo.lib")
# pragma comment(lib, "Strmiids.lib")
Both procedures will 100% serve the same purpose. I hope it would help someone.

I can't build project with quickfix [duplicate]

I have some problems with pjsua2.lib. I can't build this in QT. I added the following libraries:
INCLUDEPATH += "$$DIRECTX_PATH\Include"
INCLUDEPATH+="$$SIP_PATH\pjsip\include"
INCLUDEPATH+="$$SIP_PATH\pjlib\include"
INCLUDEPATH+="$$SIP_PATH\pjlib-util\include"
INCLUDEPATH+="$$SIP_PATH\pjnath\include"
INCLUDEPATH+="$$SIP_PATH\pjmedia\include"
INCLUDEPATH+="$$SIP_PATH\pjsip-apps\src\pjsua\pjsua_app.h"
INCLUDEPATH+="$$SIP_PATH\pjsip\src\pjsua-lib\pjsua_acc.c"
LIBS += "$$DIRECTX_PATH\Lib\x86\dsound.lib"
LIBS += "$$DIRECTX_PATH\Lib\x86\dxguid.lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\WS2_32.Lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\Ole32.Lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\WSock32.Lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\IPHlpApi.Lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\NetAPI32.Lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\AdvAPI32.Lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\Gdi32.Lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\User32.Lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\odbccp32.lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\odbc32.lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\msvfw32.Lib"
LIBS+="$$WINDOWS_SDKS_PATH\Lib\Version.Lib"
LIBS+="$$SIP_PATH\lib\libpjproject-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\pjsip\lib\pjsip-core-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\pjsip\lib\pjsip-simple-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\pjsip\lib\pjsip-ua-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\pjsip\lib\pjsua2-lib-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\pjsip\lib\pjsua-lib-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\pjlib\lib\pjlib-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\pjlib-util\lib\pjlib-util-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\pjmedia\lib\pjmedia-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\pjnath\lib\pjnath-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\third_party\lib\libbaseclasses-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\third_party\lib\libg7221codec-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\third_party\lib\libgsmcodec-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\third_party\lib\libilbccodec-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\third_party\lib\libmilenage-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\third_party\lib\libportaudio-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\third_party\lib\libresample-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\third_party\lib\libspeex-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\third_party\lib\libsrtp-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\pjmedia\lib\pjmedia-audiodev-i386-Win32-vc8-Debug.lib"
LIBS+="$$SIP_PATH\pjmedia\lib\pjmedia-codec-i386-Win32-vc8-Debug.lib"
but these errors show up whenever I try to build the application:
pjsua2-lib-i386-Win32-vc8-Debug.lib(endpoint.obj):-1: error: LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in main.obj
I think the problem comes from the compiler, but in any way, I can't seem to solve it
This means that the library you are linking to has been build with a different version / variant of the CRT (C Runtime). You either need to rebuild the library or set the runtime library version + variant (release/debug, DLL/static) in your projects properties to the same settings as all the libraries you are linking to.

Need to use release library in cmake debug build

I have generated a release library using CMAKE that needs to be kept proprietary. I plan to put header files into an include directory and library files into a lib directory.
The CMAKE line used to generate the library is:
add_library(Ethernet STATIC ${eth_srcs} $<TARGET_OBJECTS:EthernetBootloader>)
There are separate Visual Studio solutions for generating a library and running a control panel that uses the library. Running the Control Panel in debug mode only works with a debug library. If the Control Panel compiles and runs in debug mode and the library was built in release mode I get several errors that look like:
Ethernet.lib(ethernet.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
Ethernet.lib(ethernet.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in main.obj
I am beginning to write a "ethernet-config.cmake" file that contains:
set(ETHERNET_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}/include")
set(ETHERNET_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/Ethernet.lib")
string(STRIP "${ETHERNET_LIBRARIES}" ETHERNET_LIBRARIES)
and the CMakeLists.txt looks something like:
set(Ethernet_DIR "C:/MotorController/public")
find_package(Ethernet REQUIRED)
include_directories(${ETHERNET_INCLUDE_DIR})
target_link_libraries(ControlPanel ${ETHERNET_LIBRARIES})
How do I use a release library in a Visual Studio 2015 Windows 7 64-bit debug application? I think I need to adapt my CMakeLists.txt for the debug application but haven't figured it out.

LNK2038 Error when adding Boost lib into Qt project

I'm working on a C++ application in Qt and got to a point where the compiler is at least able to open the included boost library files. Now I get:
LNK2038: mismatch detected for 'runtimelibrary' value
'MTd_StaticDebug' does not match 'MDd_DynamicDebug' in main.obj
So, I have skimmed other threats about this issue. The compiler version of Qt (msvc 2014) matches the one of the lib-files (i.e. libboost_filesystem-vc140-mt-sgd-1_61). This is my include for the debug-version (haven't tried release yet because that one has other issues to be solved later).
win32:CONFIG( debug, debug|release ) {
# debug
LIBS += -L$$PWD/boost/bin.v2/libs/filesystem/build/msvc-14.0/debug/address-model-64/link-static/runtime-link-static/threading-multi/ -llibboost_filesystem-vc140-mt-sgd-1_61
LIBS += -L$$PWD/boost/bin.v2/libs/filesystem/build/msvc-14.0/debug/address-model-64/link-static/threading-multi/ -llibboost_filesystem-vc140-mt-gd-1_61
LIBS += -L$$PWD/boost/bin.v2/libs/system/build/msvc-14.0/debug/address-model-64/link-static/threading-multi/ -llibboost_system-vc140-mt-gd-1_61
}
Now, it seems that there might be something wrong with the runtime settings (/MD, /MT) but - tbh I have no idea how to check that or fix it.

mismatch detected for 'vccorlib_lib_should_be_specified_before_msvcrt_lib_to_linker': value '1' doesn't match value '0' in msvcrtd.lib

I have a C library project for UWP. There are some C files which are calling C++ WINRT functions defined in CPP file.It is compiling successfully and generating a library file(LIB). I am compiling in Visual Studio 2015 with update 1 and target platform is 10.0.10240.0
But, I want to generate DLL instead of LIB file. Here's the changes I did to change the project so that it generates DLL instead of LIB.
Try1:
So, In the startup project, In Configuration Properties => General I change Configuration from Static Library to Dynamic Library.
And in all the project, I changed from Multi-threaded Debug(/MTd) to Multi-threaded Debug DLL(/MDd).
Try2:
Created a new project Windows Universal Project and added the all the files from the project creating LIB to this project. Still, I am getting the below errors.
Now, I am getting the errors
vccorlibd.lib(init.obj) : error LNK2038: mismatch detected for 'vccorlib_lib_should_be_specified_before_msvcrt_lib_to_linker': value '1' doesn't match value '0' in msvcrtd.lib(app_appinit.obj)
vccorlibd.lib(init.obj) : error LNK2005: __crtWinrtInitType already defined in msvcrtd.lib(app_appinit.obj)
msvcrtd.lib(initializers.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
Any Suggestions how to resolve this.
I had the same Issue and fixed it using the linker flags:
/nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib
for debug builds you can use:
/nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib
The standard /nodefaultlib did not work for me.
The following linker flags (for debug) did the trick in my case:
/defaultlib:'vccorlibd.lib' /defaultlib:'msvcrtd.lib'