3

今日は CMake で遊んでいますが、これまでのところうまく機能しています。私たちのプロジェクトは、100 以上の Visual Studio 2003 プロジェクトで構成されています。VS2008、最終的には VS2010 に移行し、makefile ビルド システム (および Eclipse CDT も) をサポートしたいので、CMake 構成ファイルを使用してプロジェクトを定義し、プロジェクト ファイルと makefile を生成する方法が考えられます。

ただし、多数の OCX があり、その例を見つけることができませんでした。CMakeでOCXを構築するプロジェクトを知っている人はいますか?

ありがとう!- ジョシュ

4

3 に答える 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")
于 2012-07-02T11:46:27.683 に答える
1

FireBreathは、CMakeを使用してActiveXコントロールDLLを作成します。おそらく、OCXを作成する方法と実際には何の違いもありません。ATLを使用します。

確かに、FireBreathはブラウザプラグインを構築するためのフレームワークであるため、他にも多くのことを行いますが、cmakeの構造を見て、私たちが何をしているのかを見ることができます。私が解決しなければならなかった唯一の「トリッキーな」ことは、cmakeが.idlファイルをうまく処理できないことがあるということでした。そのため、.idlファイルを直接追加する代わりに、midl呼び出しを処理するカスタムビルドステップを作成しました。

于 2011-05-23T04:43:42.940 に答える
1

これについてあなたが従うことができるコード例を含む公開プロジェクトを私は知りません。

しかし、OCX は特定のプロパティを持つ単なる DLL であり、CMake は DLL を構築する能力が十分にあります。これはかなり実現可能です。試してみて、途中で遭遇した問題について具体的な質問を投稿してください。

于 2011-02-08T11:04:02.607 に答える