使用cmake / mingw

时间:2015-05-06 17:33:26

标签: c++ makefile cmake mingw

我对cmake和mingw都不是很熟悉。

我有一些可以用它构建的源代码(并且构建过程适用于mingw32-make)。问题是,我想输出DLL而不是.exe文件。

我有一些CMakeList文件,我认为存储了我必须更改的配置(该部分应该负责为Examples/目录中的.cpp文件生成.exe文件,将某些依赖项置于帐户):

# C examples
if(PSMOVE_BUILD_EXAMPLES)
    foreach(EXAMPLE example multiple dump_calibration battery_check)
        add_executable(${EXAMPLE} examples/c/${EXAMPLE}.c)
        target_link_libraries(${EXAMPLE} psmoveapi)
    endforeach()

    if(PSMOVE_BUILD_TRACKER AND PSMOVE_BUILD_TUIO_SERVER)
        include_directories(${PSMOVEAPI_SOURCE_DIR}/external/TUIO_CPP/TUIO)
        include_directories(${PSMOVEAPI_SOURCE_DIR}/external/TUIO_CPP/oscpack)
        add_executable(tuio_server examples/c/tuio_server.cpp
            external/TUIO_CPP/TUIO/TuioClient.cpp
...
            external/TUIO_CPP/oscpack/ip/win32/NetworkingUtils.cpp
            external/TUIO_CPP/oscpack/ip/win32/UdpSocket.cpp)
        set_target_properties(tuio_server PROPERTIES
            COMPILE_FLAGS -DOSC_HOST_LITTLE_ENDIAN)
        target_link_libraries(tuio_server psmoveapi psmoveapi_tracker)
    else()
        # Disable the TUIO Server if we don't build the tracker
        set(PSMOVE_BUILD_TUIO_SERVER OFF)
    endif()

    if(PSMOVE_BUILD_TRACKER)
        foreach(EXAMPLE distance_calibration)
            add_executable(${EXAMPLE} examples/c/${EXAMPLE}.c)
            target_link_libraries(${EXAMPLE} psmoveapi psmoveapi_tracker)
        endforeach()
    endif()
endif()

我想我应该在某处添加-DBUILDING_EXAMPLE_DLL-shared选项。但到底在哪里?或许我错过了这一点?

1 个答案:

答案 0 :(得分:1)

要制作一个dll,您需要add_library(mydlltarget SHARED mysourcefiles)而不是add_executable(myexetarget mysourcefiles)

另外,要从可执行代码中创建一个dll,您至少必须修改标头以导出要导出的类/函数。从building a dll with mingw的文档中可以看出,该过程与Visual Studio类似。如果您有标题,则定义一个宏,在构建dll时转换为__declspec(dllexport),使用dll时转换为__declspec(dllimport)

导出标题的示例如下所示:

#ifdef BUILDING_EXAMPLE_DLL
#define EXAMPLE_DLL __declspec(dllexport)
#else
#define EXAMPLE_DLL __declspec(dllimport)
#endif

然后你班级的修改是这样的:

class EXAMPLE_DLL MyClass
{
public:
        MyClass() {};
        virtual ~MyClass() {};
        void func(void);
};

然后你需要在构建dll时定义EXAMPLE_DLL。您可以使用add_definitions(-DEXAMPLE_DLL)

在CMake中执行此操作

此外,CMake还支持使用GENERATE_EXPORT_HEADER

生成导出标头

Doc for GenerateExportHeader