如何让 Eclipse CDT 与 windows 下的 WxWidgets 一起工作?

How to get Eclipse CDT working with WxWidgets under windows?

多年来,我一直在使用 Eclipse PHP、Python、JavaScript 和 lua。然而,我是 C++ 和 Eclipse CDT 的新手。我已经对 C++ 语法和约定有了足够的了解,我准备继续讨论我使用 C++ 的原因,即 GUI。起初我尝试了 Code::Blocks,这看起来更简单(我喜欢巫师!),但我真的更喜欢 IDE 与 git 集成,我意识到 C::B 没有在我设法使编译工作之前拥有它。那么,回到 Eclipse。

到目前为止,我做了以下事情:

不幸的是,这就是我被困的地方。那里有很多教程和论坛帖子,但我 运行 遇到以下一个或多个问题:

或者,我会推荐另一个 GUI 工具包,该工具包具有可访问的说明,可让其自身的当前版本与当前版本的 Eclipse 一起工作。

所以你从一个全新的 C++ 项目开始。

然后在此处添加最小示例的源代码。

接下来打开项目属性,打开 "C++ Build" -> "Settings" 并在 "C++ Compiler"->"Directories" 下添加所有包含目录。

然后转到 "C++ Linker"->"Libraries" 并添加库和它们的路径。

如果您还有问题,请告诉我们?

我将展示如何使用 MinGW 和 eclipse 编译 wxWidgets 最小示例。首先,我强烈建议您构建 wxWidgets 库的调试版和发布版。这些说明将假定情况就是如此。我不是日食专家,所以我不能保证这些是最好的方向。这些说明对我有用,但欢迎更正和改进。

这里有很多很多步骤。但是,如果您获得了一个包含最少样本的工作项目,您可以复制该项目并更改代码文件以将其用于其他项目。

在我们做任何其他事情之前,先在 eclipse 中定义 WXWIN 环境变量(如果尚未定义)。从菜单 select Window->Preferences->C/C++->Build->Environment,然后按添加按钮添加变量。

构建库附带的最小示例的最简单方法是使用命令行。为此,只需切换到 WXWIN\samples\minimal 文件夹并输入您用于构建库的完全相同的命令。由于上面给出的命令是 mingw32-make -f makefile.gcc SHARED=0 UNICODE=1 MONOLITHIC=0 BUILD=release,如果在 shell:

中执行以下命令,将导致此结果
windres --use-temp-file -i../../samples/sample.rc -ogcc_mswu\minimal_sample_rc.o    --define __WXMSW__   --define NDEBUG    --define _UNICODE --include-dir .\..\..\lib\gcc_lib\mswu --include-dir ./../../include  --include-dir .  --include-dir ./../../samples --define NOPCH
g++ -c -o gcc_mswu\minimal_minimal.o  -O2 -mthreads  -DHAVE_W32API_H -D__WXMSW__   -DNDEBUG    -D_UNICODE -I.\..\..\lib\gcc_lib\mswu -I.\..\..\include  -W -Wall -I.  -I.\..\..\samples -DNOPCH   -Wno-ctor-dtor-privacy   -MTgcc_mswu\minimal_minimal.o -MFgcc_mswu\minimal_minimal.o.d -MD -MP minimal.cpp
g++ -o gcc_mswu\minimal.exe @gcc_mswu\minimal.exe.rsp   -mthreads -L.\..\..\lib\gcc_lib -Wl,--subsystem,windows -mwindows    -lwxmsw31u_core  -lwxbase31u    -lwxtiff -lwxjpeg -lwxpng   -lwxzlib -lwxregexu -lwxexpat   -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lshlwapi -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lversion -lwsock32 -lwininet -loleacc -luxtheme

如果我们用 build=debug 执行相同的命令,我们会得到类似的命令,只有一些不同:

windres --use-temp-file -i../../samples/sample.rc -ogcc_mswud\minimal_sample_rc.o    --define __WXMSW__       --define _UNICODE --include-dir .\..\..\lib\gcc_lib\mswud --include-dir ./../../include  --include-dir .  --include-dir ./../../samples --define NOPCH
g++ -c -o gcc_mswud\minimal_minimal.o -g -O0 -mthreads  -DHAVE_W32API_H -D__WXMSW__       -D_UNICODE -I.\..\..\lib\gcc_lib\mswud -I.\..\..\include  -W -Wall -I.  -I.\..\..\samples -DNOPCH   -Wno-ctor-dtor-privacy   -MTgcc_mswud\minimal_minimal.o -MFgcc_mswud\minimal_minimal.o.d -MD -MP minimal.cpp
g++ -o gcc_mswud\minimal.exe @gcc_mswud\minimal.exe.rsp  -g -mthreads -L.\..\..\lib\gcc_lib -Wl,--subsystem,windows -mwindows    -lwxmsw31ud_core  -lwxbase31ud    -lwxtiffd -lwxjpegd -lwxpngd   -lwxzlibd -lwxregexud -lwxexpatd   -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lshlwapi -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lversion -lwsock32 -lwininet -loleacc -luxtheme

为了使用 eclipse 构建示例,我们想让它执行大致相同的命令,以解决调试和发布配置之间的细微差别。 Select 文件->新建->C/C++ 项目->C++ 托管构建。输入项目名称 select MinGW GCC,确保项目类型为 Executable/Empty 项目,然后单击完成按钮。

现在向项目中添加一个文件。你可以

  1. Selecting File->New->Source File,为文件输入一个名称,例如 "minimal.cpp" 或任何你想给它起的名字,然后点击完成。新文件将在 eclipse 中自动打开。 Select 并删除全部内容。在文本编辑器中,打开文件 WXWIN\samples\minimal\minimal.cpp,select 并复制全部内容,粘贴到刚刚在 eclipse 中创建的文件中,然后保存文件。
  2. 文件->导入->常规->文件系统。单击下一步按钮。然后 select 为目录 \samples\minimal。然后 select 文件 minimal.cpp 来自文件列表。终于按下了完成按钮。

无论如何,项目中现在应该有一个名为 minimal.cpp 的文件。要构建此文件,需要更改几个设置。从菜单中,select Project->Properties->C/C++ Build->Settings

  • 对于 GCC C++ 编译器:

    • 对于预处理器,
      • 为所有配置添加 __WXMSW___UNICODEHAVE_W32API_HNOPCH
      • 为发布配置添加NDEBUG
    • 对于包含
      • 对于所有配置,添加 ${WXWIN}\include
      • 对于调试配置,添加${WXWIN}\lib\gcc_lib\mswud
      • 对于发布配置添加${WXWIN}\lib\gcc_lib\mswu
    • 优化
      • 为发布配置selectOptimize more (-O2)
    • 用于调试
      • 用于调试配置 select 调试级别 Default (-g)
    • 对于杂项
      • 对于所有配置,在 "Other flags" 框的末尾添加 -mthreads -W -Wno-ctor-dtor-privacy
  • 对于 MinGW C++ 链接器:

    • 对于图书馆,
      • 调试配置:
        • 对于库,添加 wxmsw31ud_corewxbase31udwxtiffdwxjpegdwxpngdwxzlibdwxregexudwxexpatd
      • 发布配置:
        • 对于库,添加以下所有内容:wxmsw31u_corewxbase31uwxtiffwxjpegwxpngwxzlibwxregexuwxexpat
      • 对于所有配置
        • 对于库,添加以下所有内容:kernel32user32gdi32comdlg32winspoolwinmmshell32shlwapicomctl32ole32oleaut32uuidrpcrt4advapi32versionwsock32wininetoleaccuxtheme
        • 对于库搜索路径,添加 ${WXWIN}\lib\gcc_lib
      • 注意:对于 MinGW,库的顺序有时很重要,用于调试和发布配置的名称以 "wx" 开头的库应该首先列出。如有必要,您可以使用向上和向下箭头重新排列顺序。
    • 对于杂项,
      • 对于所有配置
        • 对于点赞者标志,添加 -mthreads -mwindows
        • 对于其他选项 (-Xlinker),添加 --subsystem=windows.
      • 对于调试配置,
        • 对于点赞者标志,在现有内容中添加-g

现在将构建调试和发布配置,但应用程序尚未完全完成。在命令提示符下构建最小应用程序的第一件事是

windres --use-temp-file ...

根据this link,eclipse只是不支持构建资源文件,所以我们需要手动处理。

  1. 将文件WXWIN\samples\sample.rc 和WXWIN\samples\sample.ico 复制到项目文件夹中。 (项目文件夹是包含先前创建的 minimal.cpp 文件的文件夹)。或者,您可以使用 File->Import-> ... 将文件导入到项目中。
  2. 现在返回Project->Properties->C/C++ Build->Settings->Build Steps.

    • 预构建步骤
      • 对于调试配置,输入windres --use-temp-file -i"${ProjDirPath}/sample.rc" -o"${CWD}\minimal_sample_rc.o" --define __WXMSW__ --define _UNICODE --include-dir ${WXWIN}\lib\gcc_lib\mswud --include-dir ${WXWIN}\include --define NOPCH
      • 对于发布配置输入windres --use-temp-file -i"${ProjDirPath}\sample.rc" -o${CWD}\minimal_sample_rc.o --define __WXMSW__ --define NDEBUG --define _UNICODE --include-dir ${WXWIN}\lib\gcc_lib\mswu --include-dir ${WXWIN}\include --define NOPCH
  3. 接下来切换回“工具设置”选项卡:

    • 对于 MinGW C++ 链接器:
      • 对于杂项,
        • 对于所有配置
          • 对于其他对象,添加 ${CWD}\minimal_sample_rc.o

这 2 个额外的步骤将使 eclipse 将资源文件和 link 资源编译成最终的可执行文件。

很有帮助!也适用于库路径为 ${WXWIN}\lib\gcc_dll 而不是 ${WXWIN}\lib\gcc_lib 的 DLL 版本。

对于独立的可执行文件,可以从 vxWidgets 库中提取所需的 DLL。至少 post-构建步骤是...

调试:

cmd.exe /Cfor %i in (wxmsw313ud_core wxbase313ud) do xcopy /D /Y "${WXWIN}\lib\gcc_dll\%i_gcc_custom.dll" 

发布:

cmd.exe /Cfor %i in (wxmsw313u_core wxbase313u) do xcopy /D /Y "${WXWIN}\lib\gcc_dll\%i_gcc_custom.dll"