背景
CMake自动生成工程,引入以前封装的类和头文件,出现了LNK2005 _DllMain@12 already defined in LIBCMT.lib等问题.
解决
将头文件:**#include “stdafx.h”**加入到没又此头文件的头文件.
附录
生成工程的CMakeLists.tx文件
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
set(PNAME yourProjectName)
project(${PNAME})
ADD_DEFINITIONS("-DWIN32 -D_WINDOWS")
# ADD_DEFINITIONS("-D_AFXDLL -D_UNICODE -DUNICODE -D_WINDLL")
ADD_DEFINITIONS("-D_UNICODE -DUNICODE -D_WINDLL")
ADD_DEFINITIONS("/Oi /GL /Gy /Zi /MT")
ADD_DEFINITIONS("/DKAG_INFRARED_OCX")
execute_process(COMMAND git rev-parse --short HEAD
TIMEOUT 5
OUTPUT_VARIABLE GIT_COMMIT_ID
OUTPUT_STRIP_TRAILING_WHITESPACE
)
add_definitions(-DHEAD_COMMIT_ID=${GIT_COMMIT_ID})
include(FetchLibHelper.cmake)
include(LibHelper.cmake)
SET(CMAKE_SHARED_LINKER_FLAGS "/OPT:REF /OPT:ICF /MACHINE:x86 /SUBSYSTEM:WINDOWS,5.01 /LTCG")
set(CMAKE_MFC_FLAG 1)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:threadSafeInit-")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zc:threadSafeInit-")
AddFetchLib(${DEP_REPO} opencv-v3.4.0-x86-v120-static)
AddFetchLib(${DEP_REPO} spdlog-1.4.0)
AddFetchLib(${DEP_REPO} cpptoml)
# FIND_PACKAGE(Boost)
# add_subdirectory(third-party/infrared-sdk)
# add_subdirectory(third-party/directshow)
# ADD_DEFINITIONS("/sdl")
set(dshowdir ${CMAKE_CURRENT_SOURCE_DIR}/third-party/directshow)
file(GLOB dshow_src ${dshowdir}/src/*.cpp)
file(GLOB dshow_head ${dshowdir}/src/*.h)
source_group("dshow" FILES ${dshow_src} ${dshow_head})
FILE(GLOB MG_SRC src/*.c
src/*.cpp
src/capture/*.cpp
src/config/*.cpp
third-party/json-cpp/src/*.cpp
third-party/base64/src/*.cpp
third-party/hidapi/src/*.cpp
src/*.idl
src/*.def)
FILE(GLOB MG_HDR src/*.h
src/*.hpp)
FILE(GLOB MG_RES src/*.rc src/*.bmp)
SOURCE_GROUP("Header Files" FILES ${MG_HDR})
SOURCE_GROUP("Resource Files" FILES ${MG_RES})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/${PNAME}.dir/${CMAKE_CFG_INTDIR}
third-party/directshow/include
${dshowdir}/src
third-party/base64/include
third-party/json-cpp/include
third-party/hidapi/include
${CMAKE_SOURCE_DIR}/src
)
LINK_LIBRARIES(strmiids winmm)
ADD_LIBRARY(${PNAME} SHARED ${MG_RES} ${dshow_src})
SET_TARGET_PROPERTIES(${PNAME} PROPERTIES SUFFIX ".ocx")
add_custom_command(TARGET ${PNAME}
POST_BUILD
COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/scripts/post-build.bat"
${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${PNAME}.ocx
${CMAKE_CURRENT_SOURCE_DIR}/Megvii_${PNAME}
VERBATIM )