我正在使用arm-linux-androideabi-g++编译器.当我尝试编译一个简单的"你好,世界!" 程序编译好.当我通过在该代码中添加一个简单的异常处理来测试它时它也可以工作(添加之后-fexceptions..我猜它默认是禁用的).
这适用于Android设备,我只想使用CMake,而不是ndk-build.
例如 - first.cpp
#include <iostream>
using namespace std;
int main()
{
try
{
}
catch (...)
{
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions
它没有问题......
问题 ...我试图用CMake文件编译文件.
我想添加-fexceptions标志.我试过了
set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )
Run Code Online (Sandbox Code Playgroud)
和
set ( CMAKE_C_FLAGS "fexceptions")
Run Code Online (Sandbox Code Playgroud)
它仍然显示错误.
我在StackOverflow和Google上搜索了一下但是无法理解.我想用这种类型的用户编程启动我的应用程序:
int main()
{
Window App("Test", 640, 480);
while(App.IsOpen())
{
// Do the stuff
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这是不可能的,因为,我应该通过hInstance和hPrevInstance和其他参数的WinMain功能.实际上有一个Window类,我设计用于使窗口创建更容易一些.我在SFML上看到了这个实现,但我不知道它是如何实现的.
现在我正在使用通常的方式:
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR, int)
{
Window App(hInst, hPrevInst, "Test", 640, 480);
while(App.IsOpen())
{
// Do the stuff
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我可以通过gcc实现这个目标:
gcc -mwindows -o simple simple.c
Run Code Online (Sandbox Code Playgroud)
但只能在cmake中找到它:
add_executable(simple WIN32 simple.c)
Run Code Online (Sandbox Code Playgroud)
但它并不完全相同-mwindows,
这将需要入口点WinMain,
虽然gcc -mwindows不需要这个(可以main).
我该怎么做呢?
我最近开始使用CMake,并且正在尝试构建一个GUI应用程序,它在Windows上没有控制台窗口.所以在我的CMakeLists.txt文件中,我这样做了:
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
add_executable(${EXECUTABLE_NAME} main.cpp)
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
add_executable(${EXECUTABLE_NAME} WIN32 main.cpp) #WIN32 So the console window does not open on Windows
endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
Run Code Online (Sandbox Code Playgroud)
有了这个,解决方案工作,并且控制台窗口无法在Windows上打开.然而,这需要付出代价.当我尝试构建解决方案时,我意识到我必须将函数的签名更改为WinMain,所以我将主代码更改为以下内容:
#ifdef _WIN32
#include <Windows.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE, PSTR, int) //Windows signature since creating WIN32 application without console
#else
int main()
#endif
{
// ... GUI code
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我绝对厌恶这一点,因为它破坏了使用CMake的全部意义.我不想在我的代码中更改基于不同平台的任何内容.这引出了我的问题.如何main()在制作GUI应用程序时将C++应用程序入口点设置为Windows,而无需在Visual Studio中手动设置它?我可以使用跨平台方法直接在CMake中执行此操作吗?或者我必须使用该#if/#else/#endif解决方案吗?上述解决方案的唯一改进是使用一个宏MAIN_FUNCTION来执行预处理器条件.我也想避免这种情况.
另一方面,还有另一种方法可以摆脱Windows上的GUI应用程序中的控制台窗口,我不知道在不使用WIN32选项的情况下使用CMake吗?