4

我只是想建立一个能够在 CMake 支持的每个平台上编译的简单项目。我在 Win7 系统上开始我的项目并编写了一个包含 SDL.h 和 GL/glew.h 的小 main.cpp。main-function 的风格是简单的 c++:

int main(int, char**) {}

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

错误 LNK2019:函数 _ _tmainCRTStartup中引用了未解析的外部符号main

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

4

1 回答 1

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

呸!任何一种选择都能让我们成功!

我浏览了 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)

希望对其他人有所帮助。

于 2013-08-20T02:58:22.347 回答