【问题标题】:Output the DLL instead of .exe with cmake/mingw使用 cmake/mingw 输出 DLL 而不是 .exe
【发布时间】:2015-05-06 17:33:25
【问题描述】:

我对 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)
  • 哇,这将是这里唯一的变化?相当强大;)
  • 您可能需要更改要导出的类的标题。我不熟悉 mingw dll,所以对此我无能为力。
  • 嗯。看起来和 Visual Studio 一样:mingw.org/wiki/sampledll 参见关于EXAMPLE_DLL 的部分。
  • 是的,确实 :) 你能从你的 cmets 那里得到答案吗?我可以接受。

标签: c++ makefile cmake mingw


【解决方案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。你可以在 CMake 中使用 add_definitions(-DEXAMPLE_DLL)

CMake 还支持使用GENERATE_EXPORT_HEADER 生成导出标头

Doc for GenerateExportHeader

【讨论】:

    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多