VS10始终链接到SUBSYSTEM:WINDOWS; CMake的+ SDL + GLEW

时间:2011-12-13 23:56:05

标签: cmake sdl glew lnk2019

我只是想设置一个能够在CMake支持的每个平台上编译的简单项目。我在Win7系统上启动了我的项目,并编写了一个包含SDL.h和GL / glew.h的main.cpp。 main函数的样式很简单:c ++:

int main(int, char**) {}

在我的CMakeLists.txt中,我调用了find_package(SDL)和find_package(GLEW)。 CMake-part运行良好,所以我刚刚打开了vs10-solution-file并尝试编译,当我得到LNK2019时:

  

错误LNK2019:函数_ _tmainCRTStartup

中未解析的外部符号主要引用

这意味着我选择了错误的子系统,不是吗?但是,如果我只是将子系统从CONSOLE切换到WINDOWS并返回,则问题仍然存在。 CMake为此设置了隐藏选项吗?如何在vs10中编译我的简单程序?

1 个答案:

答案 0 :(得分:9)

今晚我遇到了这个问题。我正在使用CMake创建一个MSVC项目来构建我的GLFW应用程序。当然,如果您自己使用MSVC,那么摆脱控制台窗口的古老技巧就是进入属性并设置"子系统"到" Windows"和"入口点"到mainCRTStartup,相当于将/SUBSYSTEM:WINDOWS /ENTRY:"mainCRTStartup"标记添加到link.exe,但CMake并没有提供一种简单的方法。

如果您只是执行直接add_executable()命令,则会将/SUBSYSTEM:CONSOLE /ENTRY:"mainCRTStartup"传递给链接器。

如果您执行add_executable(exename WIN32 ...),则会获得/SUBSYSTEM:WINDOWS

Gaah!这两种选择都让我们到了中途!

我浏览了CMake随附的.cmake文件(fwiw,我使用的是CMake 2.8.10和Visual Studio 2012 Express),并发现似乎控制/SUBSYSTEM/ENTRY的变量CMAKE_CREATE_WIN32_EXE标志称为if(MSVC) set(CMAKE_CREATE_WIN32_EXE "/SUBSYSTEM:WINDOWS /ENTRY:\"mainCRTStartup\"") endif(MSVC) 。因此,要设置这两个部分,我们只需要更改该变量。这就是我最终得到的结果,这就是诀窍:

{{1}}

希望能帮助别人。