Ошибка компоновщика: неразрешенный внешний символ _main, на который ссылается функция «int __cdecl invoke_main (void)» с проектом CMake в VS2019 - PullRequest
1 голос
/ 09 февраля 2020

Я создаю цель проекта 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": []
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...