Я создаю цель проекта x86 DLL с помощью CMake в Visual Studio (я на 64-битной машине). Мой файл CMakeLists.txt:
set(MY_HEADERS
# My files
)
set(MY_SRC
#My Files
)
add_library(MyLib SHARED ${MY_HEADERS} ${MY_SRC})
target_include_directories(MyLib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
set(ALLEGRO_DIR "${PROJECT_SOURCE_DIR}/packages/allegro5/include")
if(WIN32)
file(GLOB ALLEGRO_LIB "${PROJECT_SOURCE_DIR}/packages/allegro5/windows/x86/lib/*.lib")
add_library(Allegro SHARED IMPORTED)
set_target_properties(Allegro PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${ALLEGRO_DIR}
INTERFACE_LINK_LIBRARIES ${ALLEGRO_LIB}
IMPORTED_IMPLIB ${ALLEGRO_LIB}
)
target_link_libraries(MyLib PUBLIC Allegro)
file(GLOB ALLEGRO_DLL "${PROJECT_SOURCE_DIR}/packages/allegro5/windows/x86/bin/*.dll")
foreach(dll ${ALLEGRO_DLL})
add_custom_command(TARGET MyLib POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${dll} $<TARGET_FILE_DIR:MyLib>)
endforeach()
endif()
Если я собрал вышеупомянутое, я получаю ошибку компоновщика:
unresolved external symbol _main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)
Однако, если я изменил DLL на библиотеку stati c (т. е. add_library (MyLib STATI C $ {MY_HEADERS} $ {MY_SRC}), ошибки компоновщика нет. После прочтения сообщения об ошибке в похожих вопросах я добавил в файл CMakeLists.txt следующее:
if(WIN32)
add_definitions(-D_AFXDLL)
set(CMAKE_MFC_FLAG 2)
set_target_properties(MyLib PROPERTIES
COMPILE_DEFINITIONS _AFXDLL,_UNICODE,UNICODE,_BIND_TO_CURRENT_CRT_VERSION,_BIND_TO_CURRENT_MFC_VERSION
LINK_FLAGS "/ENTRY:\"wWinMainCRTStartup\""
)
endif()
Сразу после строки target_include_directories(MyLib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
. Однако я продолжаю получать ту же ошибку компоновщика с предупреждением:
LNK4258 directive '/ENTRY:mainCRTStartup' not compatible with switch '/ENTRY:wWinMainCRTStartup'; ignored
Единственное, что, по-видимому, устраняет эту ошибку компоновщика, - это добавить main. cpp к проекту DLL, например:
int main() {}
Зачем мне это нужно для проекта DLL и есть ли способ, которым я могу избежать этого? Обратите внимание, что я использую проект CMake шаблон из Visual Studio 2019. Мой файл CMakeSettings. json:
{
"configurations": [
{
"name": "x86-Debug",
"generator": "Ninja",
"configurationType": "Debug",
"buildRoot": "${projectDir}\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "-v",
"ctestCommandArgs": "",
"cmakeToolchain": "C:/Users/xxx/.vcpkg/scripts/buildsystems/vcpkg.cmake",
"inheritEnvironments": [ "msvc_x86" ],
"variables": []
},
{
"name": "x86-Release",
"generator": "Ninja",
"configurationType": "RelWithDebInfo",
"buildRoot": "${projectDir}\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "-v",
"ctestCommandArgs": "",
"cmakeToolchain": "C:/Users/xxx/.vcpkg/scripts/buildsystems/vcpkg.cmake",
"inheritEnvironments": [ "msvc_x86" ],
"variables": []
}
]
}