【问题标题】:cross compile dll on mac OSX with cmake and mingw使用 cmake 和 mingw 在 mac OSX 上交叉编译 dll
【发布时间】:2017-10-16 05:54:51
【问题描述】:

我在 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}
)

【问题讨论】:

  • 根据错误信息,您的编译器不支持-install_name OSX-specific 选项。可能编译器不适用于 OSX。
  • 我不知道如何告诉 cmake 忽略 -install_name 选项。
  • 如果你的编译器不是针对宿主系统的,即你想交叉编译其他平台的项目,你需要使用工具链文件,对应目标平台。

标签: c++ windows cmake mingw


【解决方案1】:

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

目标平台上与编译相关的参数(如系统名称、处理器、编译器等)不应在您定义项目的CMakeLists.txt文件中(使用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

此设计保留您项目的 CMakeLists.txt 文件工具链不可知论。

【讨论】:

  • 我知道这是违反规则的,但是很好的答案,非常感谢!
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多