使用cmake和mingw在mac OSX上交叉编译dll

时间:2017-10-16 05:54:51

标签: c++ windows cmake mingw

我在Mac OSX上通过wine安装了bwapi。我尝试在Mac OSX上使用CMake和MinGW编译ExampleAIModule。 ExampleAIModule实际上是一个VS2017项目,我写了一个CMakeLists.txt,运行cmake CMakeLists.txt && make VERBOSE=1得到了一些错误。我想知道如何修复我的CMakeLists.txt?

文件夹结构:

BWAPI/ExampleAIModule/CMakeLists.txt
BWAPI/ExampleAIModule/Source/*.cpp *.h
BWAPI/include/*.h
BWAPI/lib/BWAPI.lib
BWAPI/lib/BWAPIClient.lib

make出错:

Linking CXX shared library libExampleAIModule.dylib
/usr/local/Cellar/cmake/3.2.2/bin/cmake -E cmake_link_script CMakeFiles/ExampleAIModule.dir/link.txt --verbose=1
i686-w64-mingw32-g++   -std=c++11 -O3 -DNDEBUG -dynamiclib -Wl,-headerpad_max_install_names  -o libExampleAIModule.dylib -install_name @rpath/libExampleAIModule.dylib CMakeFiles/ExampleAIModule.dir/Source/Dll.cpp.o CMakeFiles/ExampleAIModule.dir/Source/ExampleAIModule.cpp.o  -L/.wine/drive_c/Starcraft/BWAPI/ExampleAIModule/../lib
i686-w64-mingw32-g++: error: rpath/libExampleAIModule.dylib: No such file or directory
i686-w64-mingw32-g++: error: unrecognized command line option ‘-install_name’
make[2]: *** [libExampleAIModule.dylib] Error 1
make[1]: *** [CMakeFiles/ExampleAIModule.dir/all] Error 2

的CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)

################### Variables. ####################
# Change if you want modify path or other values. #
###################################################

set(PROJECT_NAME ExampleAIModule)
# Output Variables
# Folders files
set(CPP_DIR_1 Source)
set(HEADER_DIR_1 Source)

############## Define Project. ###############
# ---- This the main options of project ---- #
##############################################

project(${PROJECT_NAME} CXX)

# Define Release by default.
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release")
  message(STATUS "Build type not specified: defaulting to release.")
endif(NOT CMAKE_BUILD_TYPE)

# Definition of Macros
add_definitions(
   -DNOMINMAX 
   -D_DEBUG 
   -D_WINDOWS 
   -D_USRDLL 
   -DEXAMPLEAIMODULE_EXPORTS 
   -DUNICODE
   -D_UNICODE
)

################# Flags ################
# Defines Flags for Windows and Linux. #
########################################

if(MSVC)
   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W3 /EHsc")
   set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /W3 /EHsc")
endif(MSVC)
if(NOT MSVC)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
   if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
       set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
   endif()
endif(NOT MSVC)

########### Add by me #############

SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)

include_directories(../include)
link_directories(../lib)

################ Files ################
#   --   Add files to project.   --   #
#######################################

file(GLOB SRC_FILES
    ${CPP_DIR_1}/*.cpp
    ${HEADER_DIR_1}/*.h
)

# Add library to build.
add_library(${PROJECT_NAME} SHARED
   ${SRC_FILES}
)

1 个答案:

答案 0 :(得分:0)

CMake 始终使用工具链为特定平台/目标进行编译,如here 所述。但是,对于交叉编译,您需要指定它需要使用的工具链文件。这是使用 CMAKE_TOOLCHAIN_FILE 变量完成的,如 here 所述。

与目标平台上的编译相关的参数(例如系统名称、处理器、编译器等)不应在您定义项目的 CMakeLists.txt 文件中(使用 {{1 }} 函数)。

相反,您应该在工具链文件中设置与交叉编译相关的编译器和其他参数。并且您可能有一个工具链文件,用于您想要交叉编译的每个平台。

假设编译器位于路径中,您的工具链文件可能如下所示:

project

如果您的工具链文件的路径为 set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR x86_64) SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc) SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) ,则您需要将 /toolchains/windows.cmake 传递给 -DCMAKE_TOOLCHAIN_FILE=/toolchains/windows.cmake

这种设计使您项目的 cmake 文件工具链不可知。