2009-12-30 107 views
3

今天我一直在玩CMake,到目前爲止它一直在努力工作。我們的項目包含+100 Visual Studio 2003項目;我們希望轉移到VS2008,最終VS2010以及支持makefile構建系統(也許還包括Eclipse CDT)......所以使用CMake配置文件定義項目並生成項目文件和makefile似乎是一種可行的方式。CMake構建一個ActiveX OCX?

但是,我們有大量的OCX,我一直沒有找到任何這方面的例子。有誰知道用CMake構建OCX的項目嗎?

謝謝! - 喬什

+1

我正試圖實現這個權利。 – 2010-08-15 12:24:53

+0

你解決它時做了什麼? – Sambatyon 2012-04-02 06:52:07

回答

1

我不知道任何公共項目與示例代碼,你可以按照這個。

但是,OCX只是具有某些屬性的DLL,CMake非常適合構建DLL。這應該是相當可行的。您應該嘗試一下,併發布有關您遇到的任何問題的具體問題。

1

FireBreath使用CMake創建ActiveX控件DLL。這可能與您創建OCX的方式沒有任何區別。它確實使用ATL。當然,FireBreath也做了很多其他的事情,因爲它是構建瀏覽器插件的框架,但你可以看看cmake structure,看看我們在做什麼。我必須解決的唯一「棘手」問題是cmake有時不能很好地處理.idl文件,所以不是直接添加.idl文件,而是創建自定義構建步驟來處理midl調用。

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") 
+0

爲了補充一點,這個解決方案只適用於visual studio,如果你嘗試用類似於這個的cmakelists.txt創建一個activex,用mingw32你會得到很多奇怪的錯誤,導致visual studio放了很多的魔術將activex數據與實際代碼「粘合」起來。 – gabry 2013-06-06 16:54:46