使用CMake构建ActiveX OCX?

3
我今天在使用CMake,目前为止工作得很好。我们的项目包含100多个Visual Studio 2003项目;我们想要转移到VS2008,并最终支持makefile构建系统(也可能是Eclipse CDT)……因此,通过使用CMake配置文件定义项目并生成项目文件和makefiles似乎是可行的方法。
然而,我们有大量的OCX文件,并且我没有找到任何关于使用CMake构建OCX项目的示例。有人知道吗?
谢谢!- Josh

1
我现在正在尝试实现这个。 - Roman Plášil
你是怎么解决它的? - Sambatyon
3个回答

2

所以,花了一些时间,但这就是我如何使用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")

只是要补充说明的是,这个解决方案仅适用于Visual Studio,如果您尝试使用类似于此的CMakeLists.txt构建ActiveX,并且使用mingw32进行操作,则会遇到很多奇怪的错误,因为Visual Studio在“粘合”ActiveX数据与实际代码时放置了许多魔术。 - gabry

1

FireBreath使用CMake创建ActiveX控件DLL。这与创建OCX的方式可能并没有太大区别。它确实使用了ATL。

当然,由于FireBreath是用于构建浏览器插件的框架,因此它还可以做很多其他事情,但您可以查看CMake结构并了解我们正在做什么。我需要解决的唯一“棘手”问题是,cmake有时无法很好地处理.idl文件,因此我创建了自定义构建步骤来处理midl调用,而不是直接添加.idl文件。


1

我不知道有什么公共项目有示例代码,供您参考。

但OCX只是具有某些特定属性的DLL,而CMake非常能够构建DLL。这应该是相当可行的。您应该尝试一下,并在您实践过程中遇到任何问题时发布具体问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接