使用 cmake/mingw 输出 DLL 而不是 .exe

Output the DLL instead of .exe with 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 选项。但具体在哪里?还是我没抓住要点?

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

此外,要从可执行代码生成 dll,您至少必须修改 headers 以导出要导出的 classes/functions。从 building a dll with mingw 的文档中可以看出,该过程类似于 Visual Studio。在你有 header 的地方定义一个宏,在构建 dll 时转换为 __declspec(dllexport),在使用 dll 时转换为 __declspec(dllimport)

导出示例 header 如下所示:

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

那么你的class修改如下:

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

那么在构建dll的时候需要定义EXAMPLE_DLL。您可以在 CMake 中使用 add_definitions(-DEXAMPLE_DLL)

CMake 还支持使用 GENERATE_EXPORT_HEADER

生成导出 header

Doc for GenerateExportHeader