使用CMake复制mingw32构建

问题描述

我有以下mingw32构建指令,它可以工作。该命令可以在Linux机器上成功构建Windows DLL。

/usr/bin/x86_64-w64-mingw32-g++ -march=x86-64 -mtune=x86-64 -O2 -shared -static -static-libgcc -static-libstdc++ -s -fno-rtti -fno-exceptions -I /home/mbilyanov/.wine/drive_c/SierraChartLinux/ACS_Source/ -w ./src/MySCStudy.cpp -o ./build/MySCStudy.dll

如何在CMake中重现此内容?目标是使用CMake进行构建,并获得完全相同的DLL文件。这是我到目前为止所拥有的:

# ;--------------------------------------------------------------------------------
# ; Initials
# ;--------------------------------------------------------------------------------
cmake_minimum_required(VERSION 3.1)
project(MySCStudy)

MESSAGE(STATUS "<${PROJECT_NAME}> CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
MESSAGE(STATUS "<${PROJECT_NAME}> CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")

# ;--------------------------------------------------------------------------------
# ; Include Directories
# ;--------------------------------------------------------------------------------
set(SC_INCLUDE_DIR /home/mbilyanov/.wine/drive_c/SierraChartLinux/ACS_Source)
MESSAGE(STATUS "<${PROJECT_NAME}> SC_INCLUDE_DIR: ${SC_INCLUDE_DIR}")

# ;--------------------------------------------------------------------------------
# ; Compiler Flags
# ;--------------------------------------------------------------------------------
add_compile_options(-D _WIN64 -U NOMINMAX -march=x86-64 -mtune=x86-64 -O2 -shared -static -static-libgcc -static-libstdc++ -s -fno-rtti -fno-exceptions -std=gnu++11 -Wno-deprecated)

# ;--------------------------------------------------------------------------------
# ; Source Files
# ;--------------------------------------------------------------------------------
set(SOURCE_FILES ./src/MySimpleMA.cpp)
MESSAGE(STATUS "<${PROJECT_NAME}> SOURCE_FILES: ${SOURCE_FILES}")

# ;--------------------------------------------------------------------------------
# ; Properties
# ;--------------------------------------------------------------------------------
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}/${CMAKE_BUILD_TYPE}/lib)
set(CMAKE_SHARED_LIBRARY_PREFIX "")

include_directories(${PROJECT_NAME} PUBLIC ${SC_INCLUDE_DIR})
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})

使用此工具进行构建时,没有出现任何错误,但是输出DLL格式错误

有关我要解决的此问题的更多信息。

  • 这是在Linux(Ubuntu 18)上。

  • 正在构建的DLL是另一个Windows应用程序的插件

  • 我正在使用x86_64-w64-mingw32-g++

  • DLL所依赖的头文件位于项目范围之外的外部路径(请参阅成功构建此文件的终端命令)。

  • 我建立了一个单独的工具链文件,该文件告诉CMake使用x86_64-w64-mingw32-g ++作为编译器。该文件位于此处:toolchain-mingw32-cmake

  • 现在的源代码非常简单,只是一个样板的C ++代码

    #include "sierrachart.h"
    SCDLLName("StudiesFileName")
    
    //This is a global integer variable
    int g_GlobalIntegerVariable;
    
    SCSFExport scsf_StudyFunction(SCStudyInterfaceRef sc)
    {
        if (sc.SetDefaults)
        {
    
        }
     }
    
  • 此处引用的头文件#include "sierrachart.h"和许多其他头文件位于外部包含目录:/home/mbilyanov/.wine/drive_c/SierraChartLinux/ACS_Source

  • 作为回报,这些头文件将引用位于认包含文件x86_64-w64-mingw32中的其他头文件,诸如windows.h等。

  • 一旦导入CMake生成的DLL,主机应用程序将引发以下错误

     CreateStudyDLLModuleFunctionObject | Error loading 
     C:\SierraChartLinux\Data\MySCStudy.dll. Windows error code 126: Module not 
     found. Likely missing dependency file. | 2020-09-21 08:18:59.845 *`
    
  • 我已经检查了mingw编译的DLL,还检查了使用Dependency Walker的Windows本机版本(本机应用程序允许编译c ++源代码)-它们都是有效的DLL,并且没有任何坏处。但是,使用CMake构建的DLL被标识为完全无效的DLL。我什至无法将其加载到Dependency Walker中!我得到了No DOS or PE signature found. This file is not a valid 32-bit or 64-bit Windows module.

  • 这是一个重复的问题吗?!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)