如何让 Eclipse CDT 与 windows 下的 WxWidgets 一起工作?
How to get Eclipse CDT working with WxWidgets under windows?
- wxWidgets-3.1.3
- 日食IDE 4.14.0
- Eclipse CDT 9.10.0.2019x(截至 2020 年 2 月 2 日的最新软件包)
- MinGW 编译器,通过 MSYS2 安装
- Windows 10 专业版
多年来,我一直在使用 Eclipse PHP、Python、JavaScript 和 lua。然而,我是 C++ 和 Eclipse CDT 的新手。我已经对 C++ 语法和约定有了足够的了解,我准备继续讨论我使用 C++ 的原因,即 GUI。起初我尝试了 Code::Blocks,这看起来更简单(我喜欢巫师!),但我真的更喜欢 IDE 与 git 集成,我意识到 C::B 没有在我设法使编译工作之前拥有它。那么,回到 Eclipse。
到目前为止,我做了以下事情:
- 将 MinGW 编译器路径添加到 %PATH%
- 使用 SHARED=0 UNICODE=1 MONOLITHIC=0 BUILD=release 成功编译了 wxWidgets 3.1.3,这些更改在 %WXDIR%\build\msw\config.gcc 中进行。我发现的各种教程在这些参数上大相径庭,但是在这里和其他论坛上对遇到我的问题的人的各种回应基本上都同意这些参数,除了 BUILD 之外,它们是默认值。所以.
- 从samples/minimal成功编译了一个测试程序。生成的可执行文件 运行s 不需要同一目录中的任何其他 DLL。
不幸的是,这就是我被困的地方。那里有很多教程和论坛帖子,但我 运行 遇到以下一个或多个问题:
- 新手无法访问。 "Add a link to your wxWidgets directory" 但是好吧,我该怎么做,你是说主要的 %WXDIR% 代码目录还是 %WXDIR%\lib 还是什么?
- 不工作。 "Just File->Import->File System->%WXDIR%" 没有。实际上,在从 "minimal.cpp" 粘贴的代码中删除了一些引用的 "not resolved",但不是全部。
- 明确引用 IDE 或代码的版本,哦,比如说,十年前,and/or 包含当前版本无法遵循的说明。
或者,我会推荐另一个 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 项目,然后单击完成按钮。
现在向项目中添加一个文件。你可以
- Selecting File->New->Source File,为文件输入一个名称,例如 "minimal.cpp" 或任何你想给它起的名字,然后点击完成。新文件将在 eclipse 中自动打开。 Select 并删除全部内容。在文本编辑器中,打开文件 WXWIN\samples\minimal\minimal.cpp,select 并复制全部内容,粘贴到刚刚在 eclipse 中创建的文件中,然后保存文件。
- 文件->导入->常规->文件系统。单击下一步按钮。然后 select 为目录 \samples\minimal。然后 select 文件 minimal.cpp 来自文件列表。终于按下了完成按钮。
无论如何,项目中现在应该有一个名为 minimal.cpp 的文件。要构建此文件,需要更改几个设置。从菜单中,select Project->Properties->C/C++ Build->Settings
对于 GCC C++ 编译器:
- 对于预处理器,
- 为所有配置添加
__WXMSW__
、_UNICODE
、HAVE_W32API_H
和 NOPCH
。
- 为发布配置添加
NDEBUG
- 对于包含
- 对于所有配置,添加
${WXWIN}\include
- 对于调试配置,添加
${WXWIN}\lib\gcc_lib\mswud
- 对于发布配置添加
${WXWIN}\lib\gcc_lib\mswu
- 优化
- 为发布配置select
Optimize more (-O2)
- 用于调试
- 用于调试配置 select 调试级别
Default (-g)
- 对于杂项
- 对于所有配置,在 "Other flags" 框的末尾添加
-mthreads -W -Wno-ctor-dtor-privacy
。
对于 MinGW C++ 链接器:
- 对于图书馆,
- 调试配置:
- 对于库,添加
wxmsw31ud_core
、wxbase31ud
、wxtiffd
、wxjpegd
、wxpngd
、wxzlibd
、wxregexud
和 wxexpatd
- 发布配置:
- 对于库,添加以下所有内容:
wxmsw31u_core
、wxbase31u
、wxtiff
、wxjpeg
、wxpng
、wxzlib
、 wxregexu
和 wxexpat
- 对于所有配置
- 对于库,添加以下所有内容:
kernel32
、user32
、gdi32
、comdlg32
、winspool
、winmm
、 shell32
、shlwapi
、comctl32
、ole32
、oleaut32
、uuid
、rpcrt4
、advapi32
、version
、wsock32
、wininet
、oleacc
和 uxtheme
。
- 对于库搜索路径,添加
${WXWIN}\lib\gcc_lib
- 注意:对于 MinGW,库的顺序有时很重要,用于调试和发布配置的名称以 "wx" 开头的库应该首先列出。如有必要,您可以使用向上和向下箭头重新排列顺序。
- 对于杂项,
- 对于所有配置
- 对于点赞者标志,添加
-mthreads -mwindows
- 对于其他选项 (-Xlinker),添加
--subsystem=windows
.
- 对于调试配置,
- 对于点赞者标志,在现有内容中添加
-g
。
现在将构建调试和发布配置,但应用程序尚未完全完成。在命令提示符下构建最小应用程序的第一件事是
windres --use-temp-file ...
根据this link,eclipse只是不支持构建资源文件,所以我们需要手动处理。
- 将文件WXWIN\samples\sample.rc 和WXWIN\samples\sample.ico 复制到项目文件夹中。 (项目文件夹是包含先前创建的 minimal.cpp 文件的文件夹)。或者,您可以使用 File->Import-> ... 将文件导入到项目中。
现在返回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
接下来切换回“工具设置”选项卡:
- 对于 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"
- wxWidgets-3.1.3
- 日食IDE 4.14.0
- Eclipse CDT 9.10.0.2019x(截至 2020 年 2 月 2 日的最新软件包)
- MinGW 编译器,通过 MSYS2 安装
- Windows 10 专业版
多年来,我一直在使用 Eclipse PHP、Python、JavaScript 和 lua。然而,我是 C++ 和 Eclipse CDT 的新手。我已经对 C++ 语法和约定有了足够的了解,我准备继续讨论我使用 C++ 的原因,即 GUI。起初我尝试了 Code::Blocks,这看起来更简单(我喜欢巫师!),但我真的更喜欢 IDE 与 git 集成,我意识到 C::B 没有在我设法使编译工作之前拥有它。那么,回到 Eclipse。
到目前为止,我做了以下事情:
- 将 MinGW 编译器路径添加到 %PATH%
- 使用 SHARED=0 UNICODE=1 MONOLITHIC=0 BUILD=release 成功编译了 wxWidgets 3.1.3,这些更改在 %WXDIR%\build\msw\config.gcc 中进行。我发现的各种教程在这些参数上大相径庭,但是在这里和其他论坛上对遇到我的问题的人的各种回应基本上都同意这些参数,除了 BUILD 之外,它们是默认值。所以.
- 从samples/minimal成功编译了一个测试程序。生成的可执行文件 运行s 不需要同一目录中的任何其他 DLL。
不幸的是,这就是我被困的地方。那里有很多教程和论坛帖子,但我 运行 遇到以下一个或多个问题:
- 新手无法访问。 "Add a link to your wxWidgets directory" 但是好吧,我该怎么做,你是说主要的 %WXDIR% 代码目录还是 %WXDIR%\lib 还是什么?
- 不工作。 "Just File->Import->File System->%WXDIR%" 没有。实际上,在从 "minimal.cpp" 粘贴的代码中删除了一些引用的 "not resolved",但不是全部。
- 明确引用 IDE 或代码的版本,哦,比如说,十年前,and/or 包含当前版本无法遵循的说明。
或者,我会推荐另一个 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 项目,然后单击完成按钮。
现在向项目中添加一个文件。你可以
- Selecting File->New->Source File,为文件输入一个名称,例如 "minimal.cpp" 或任何你想给它起的名字,然后点击完成。新文件将在 eclipse 中自动打开。 Select 并删除全部内容。在文本编辑器中,打开文件 WXWIN\samples\minimal\minimal.cpp,select 并复制全部内容,粘贴到刚刚在 eclipse 中创建的文件中,然后保存文件。
- 文件->导入->常规->文件系统。单击下一步按钮。然后 select 为目录 \samples\minimal。然后 select 文件 minimal.cpp 来自文件列表。终于按下了完成按钮。
无论如何,项目中现在应该有一个名为 minimal.cpp 的文件。要构建此文件,需要更改几个设置。从菜单中,select Project->Properties->C/C++ Build->Settings
对于 GCC C++ 编译器:
- 对于预处理器,
- 为所有配置添加
__WXMSW__
、_UNICODE
、HAVE_W32API_H
和NOPCH
。 - 为发布配置添加
NDEBUG
- 为所有配置添加
- 对于包含
- 对于所有配置,添加
${WXWIN}\include
- 对于调试配置,添加
${WXWIN}\lib\gcc_lib\mswud
- 对于发布配置添加
${WXWIN}\lib\gcc_lib\mswu
- 对于所有配置,添加
- 优化
- 为发布配置select
Optimize more (-O2)
- 为发布配置select
- 用于调试
- 用于调试配置 select 调试级别
Default (-g)
- 用于调试配置 select 调试级别
- 对于杂项
- 对于所有配置,在 "Other flags" 框的末尾添加
-mthreads -W -Wno-ctor-dtor-privacy
。
- 对于所有配置,在 "Other flags" 框的末尾添加
- 对于预处理器,
对于 MinGW C++ 链接器:
- 对于图书馆,
- 调试配置:
- 对于库,添加
wxmsw31ud_core
、wxbase31ud
、wxtiffd
、wxjpegd
、wxpngd
、wxzlibd
、wxregexud
和wxexpatd
- 对于库,添加
- 发布配置:
- 对于库,添加以下所有内容:
wxmsw31u_core
、wxbase31u
、wxtiff
、wxjpeg
、wxpng
、wxzlib
、wxregexu
和wxexpat
- 对于库,添加以下所有内容:
- 对于所有配置
- 对于库,添加以下所有内容:
kernel32
、user32
、gdi32
、comdlg32
、winspool
、winmm
、shell32
、shlwapi
、comctl32
、ole32
、oleaut32
、uuid
、rpcrt4
、advapi32
、version
、wsock32
、wininet
、oleacc
和uxtheme
。 - 对于库搜索路径,添加
${WXWIN}\lib\gcc_lib
- 对于库,添加以下所有内容:
- 注意:对于 MinGW,库的顺序有时很重要,用于调试和发布配置的名称以 "wx" 开头的库应该首先列出。如有必要,您可以使用向上和向下箭头重新排列顺序。
- 调试配置:
- 对于杂项,
- 对于所有配置
- 对于点赞者标志,添加
-mthreads -mwindows
- 对于其他选项 (-Xlinker),添加
--subsystem=windows
.
- 对于点赞者标志,添加
- 对于调试配置,
- 对于点赞者标志,在现有内容中添加
-g
。
- 对于点赞者标志,在现有内容中添加
- 对于所有配置
- 对于图书馆,
现在将构建调试和发布配置,但应用程序尚未完全完成。在命令提示符下构建最小应用程序的第一件事是
windres --use-temp-file ...
根据this link,eclipse只是不支持构建资源文件,所以我们需要手动处理。
- 将文件WXWIN\samples\sample.rc 和WXWIN\samples\sample.ico 复制到项目文件夹中。 (项目文件夹是包含先前创建的 minimal.cpp 文件的文件夹)。或者,您可以使用 File->Import-> ... 将文件导入到项目中。
现在返回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
- 对于调试配置,输入
- 预构建步骤
接下来切换回“工具设置”选项卡:
- 对于 MinGW C++ 链接器:
- 对于杂项,
- 对于所有配置
- 对于其他对象,添加
${CWD}\minimal_sample_rc.o
- 对于其他对象,添加
- 对于所有配置
- 对于杂项,
- 对于 MinGW C++ 链接器:
这 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"