我今天一直在玩 CMake,到目前为止它运行良好。我们的项目由 +100 个 Visual Studio 2003 项目组成;我们希望迁移到 VS2008 并最终迁移到 VS2010,并且还支持 makefile 构建系统(可能还有 Eclipse CDT)......因此使用 CMake 配置文件定义我们的项目并生成项目文件和 makefile 似乎是一种可行的方法。
但是,我们有大量的 OCX,我还没有找到任何这样的例子。有人知道使用 CMake 构建 OCX 的项目吗?
谢谢!- 乔什
我今天一直在玩 CMake,到目前为止它运行良好。我们的项目由 +100 个 Visual Studio 2003 项目组成;我们希望迁移到 VS2008 并最终迁移到 VS2010,并且还支持 makefile 构建系统(可能还有 Eclipse CDT)......因此使用 CMake 配置文件定义我们的项目并生成项目文件和 makefile 似乎是一种可行的方法。
但是,我们有大量的 OCX,我还没有找到任何这样的例子。有人知道使用 CMake 构建 OCX 的项目吗?
谢谢!- 乔什
所以,花了一段时间,但这就是我设法使用 cmake 创建一个 activex 项目的方法。但是,我不得不说我首先必须用 Visual Studio 创建 Activex 项目才能生成一些文件,然后我转换成一个 cmake 项目。
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(MyProject)
# Very useful if project has more than one target
SET(BIN_OUTPUT_DIR ${MyProject_BINARY_DIR}/bin)
SET(LIB_OUTPUT_DIR ${MyProject_BINARY_DIR}/lib)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIR})
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIR})
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB_OUTPUT_DIR})
ADD_DEFINITIONS("-DWIN32 -D_WINDOWS -D_USRDLL")
ADD_DEFINITIONS("-D_AFXDLL -D_UNICODE -DUNICODE -D_WINDLL")
# Not sure if all this compiler flags are needed, but they reflect the default
# parameter when creating an activex project
ADD_DEFINITIONS("/Oi /GL /Gy /Z7")
SET(CMAKE_SHARED_LINKER_FLAGS "/OPT:REF /OPT:ICF /MACHINE:X86 /SUBSYSTEM:WINDOWS /LTCG")
# I left this here just as an example it is not needed
FIND_PACKAGE(Boost)
SET(TargetName MyTarget)
FILE(GLOB mytarget_src *.cpp *.idl *.def)
FILE(GLOB mytarget_hdr *.hpp *.h)
FILE(GLOB mytarget_res *.rc *.bmp)
SOURCE_GROUP("Header Files" FILES ${mytarget_hdr})
SOURCE_GROUP("Resource Files" FILES ${mytarget_res})
# I tried to make this work, but I couldn't, so right now my project doesn't use pch's
#ADD_PRECOMPILED_HEADER(${TargetName} stdafx.h stdafx.cpp)
# The last directory is a hack, but it is needed, since the midl compiler outputs the
# tlb file there, which is later needed by the resource compiler
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR}
${CMAKE_CURRENT_BINARY_DIR}/${TargetName}.dir/${CMAKE_CFG_INTDIR})
ADD_LIBRARY(${TargetName} SHARED ${mytarget_src} ${mytarget_hdr} ${mytarget_res})
TARGET_LINK_LIBRARIES(${TargetName}) # It is obvious what you put here
SET_TARGET_PROPERTIES(${TargetName} PROPERTIES SUFFIX ".ocx")
FireBreath使用 CMake 创建 ActiveX 控件 DLL。它可能与您创建 OCX 的方式没有任何不同。它确实使用 ATL。
当然,FireBreath 还可以做很多其他事情,因为它是一个构建浏览器插件的框架,但是您可以查看cmake 结构并了解我们在做什么。我必须解决的唯一“棘手”问题是 cmake 有时不能很好地处理 .idl 文件,因此我没有直接添加 .idl 文件,而是创建了自定义构建步骤来处理 midl 调用。
我不知道任何带有示例代码的公共项目,您可以按照此操作。
但是 OCX 只是具有某些属性的 DLL,而 CMake 非常有能力构建 DLL。这应该是相当可行的。您应该尝试一下,并发布有关您在此过程中遇到的任何问题的具体问题。