今天我一直在玩CMake,到目前为止它一直在努力工作。我们的项目包含+100 Visual Studio 2003项目;我们希望转移到VS2008,最终VS2010以及支持makefile构建系统(也许还包括Eclipse CDT)......所以使用CMake配置文件定义项目并生成项目文件和makefile似乎是一种可行的方式。CMake构建一个ActiveX OCX?
但是,我们有大量的OCX,我一直没有找到任何这方面的例子。有谁知道用CMake构建OCX的项目吗?
谢谢! - 乔什
今天我一直在玩CMake,到目前为止它一直在努力工作。我们的项目包含+100 Visual Studio 2003项目;我们希望转移到VS2008,最终VS2010以及支持makefile构建系统(也许还包括Eclipse CDT)......所以使用CMake配置文件定义项目并生成项目文件和makefile似乎是一种可行的方式。CMake构建一个ActiveX OCX?
但是,我们有大量的OCX,我一直没有找到任何这方面的例子。有谁知道用CMake构建OCX的项目吗?
谢谢! - 乔什
我不知道任何公共项目与示例代码,你可以按照这个。
但是,OCX只是具有某些属性的DLL,CMake非常适合构建DLL。这应该是相当可行的。您应该尝试一下,并发布有关您遇到的任何问题的具体问题。
FireBreath使用CMake创建ActiveX控件DLL。这可能与您创建OCX的方式没有任何区别。它确实使用ATL。当然,FireBreath也做了很多其他的事情,因为它是构建浏览器插件的框架,但你可以看看cmake structure,看看我们在做什么。我必须解决的唯一“棘手”问题是cmake有时不能很好地处理.idl文件,所以不是直接添加.idl文件,而是创建自定义构建步骤来处理midl调用。
所以,它花了一段时间,但这是我如何设法使用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 2013-06-06 16:54:46
我正试图实现这个权利。 – 2010-08-15 12:24:53
你解决它时做了什么? – Sambatyon 2012-04-02 06:52:07