【问题标题】:2 Issues with Codelite MinGW G++Codelite MinGW G++ 的 2 个问题
【发布时间】:2014-09-03 07:01:52
【问题描述】:

我正在使用带有内置 mingw 4.8.1 编译器/链接器的最新版本的 codelite。

我遇到的第一个问题是,当我使用 MinGW 在 Codelite 中创建一个新的 g++ 项目,然后将 -mwindows 标志添加到链接器构建设置以使用 (HBRUSH)GetStockObject(BLACK_BRUSH) 时,我在代码中的任何 cout 语句都不会'不打印到控制台。我需要 GetStockObject 的 -mwindows 标志才能工作,但我不知道它为什么会破坏 cout 语句。代码编译和运行都很好,只是没有任何东西打印到控制台。

我遇到的第二个问题是,当我尝试实例化位于不同项目中但仍在同一工作区下的基本类时。如果我只是在我正在工作的项目中链接 .h 类文件,当我尝试实例化另一个项目中的任何类时,链接器将给出未定义的引用错误。例如:

Framework *test = new Framework();

会放弃

E:/CodeLite/ElysiumEngine/Main/main.cpp:9: undefined reference to `Framework::Framework()'

当我在标题中包含这个 api.hpp 文件时:

#ifndef FRAMEWORKAPI_HPP
#define FRAMEWORKAPI_HPP

#include "Framework.hpp"

#endif // FRAMEWORKAPI_HPP

但是一旦我这样做,代码链接并运行得很好:

#ifndef FRAMEWORKAPI_HPP
#define FRAMEWORKAPI_HPP

#include "Framework.hpp"
#include "Framework.cpp"

#endif // FRAMEWORKAPI_HPP

我从来不需要在我正在处理的任何其他编译器或项目中链接 .cpp 文件。这对我来说没有任何意义。

有什么办法可以解决这两个问题吗?

【问题讨论】:

    标签: winapi c++11 linker g++ mingw32


    【解决方案1】:

    只回答你的第一个问题:

    -mwindows 标志使编译器将 --subsystem,windows 标志传递给链接器。

    链接器标志 --subsystem,windows 使您的最终可执行文件被标记为非控制台(窗口化)应用程序,它还将默认入口点设置为 WinMainCRTStartup。

    WinMainCRTStartup 不会初始化控制台 I/O,因此在控制台打印/读取的任何内容都会被忽略

    【讨论】:

    • 好的,似乎有两种解决方案。要么设置我的窗口结构,这样我就不需要传递子系统窗口标志,要么自己初始化控制台 I/O。那么当我填写 WNDCLASSEX 窗口结构时,我需要设置什么 WNDCLASSEX::hbrBackground 所以我不需要使用 GetStockObject?另外,如何初始化控制台 I/O 以便我可以使用它?这将是一个 D3D 应用程序,所以我想我应该弄清楚如何进行控制台 I/O?
    • 我找到了这个链接:justcheckingonall.wordpress.com/2008/08/29/… 它显示了如何打开控制台窗口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多