繁体   English   中英

用cygwin和cmake对“ WinMain”的未定义引用

[英]undefined reference to `WinMain' with cygwin and cmake

我正在尝试在Windows 7中使用cygwin构建可执行文件,并且在链接阶段出现以下错误。

/usr/lib/gcc/x86_64-pc-cygwin/4.9.3/../../../../lib/libcygwin.a(libcmain.o): In function `main':
/usr/src/debug/cygwin-2.3.0-1/winsup/cygwin/lib/libcmain.c:39: undefined reference to `WinMain'
/usr/src/debug/cygwin-2.3.0-1/winsup/cygwin/lib/libcmain.c:39:(.text.startup+0x7f): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `WinMain'
collect2: error: ld returned 1 exit status

我不明白为什么它试图找到WinMain。 我有一个cpp文件,其中定义了int main(int,char **)函数,该函数是构建的一部分。 我不明白为什么它要使用libcmain.c,它是可执行文件创建过程中cygwin的一部分。 我正在使用cmake,它具有以下功能:

add_executable(binary_name ${SOURCE_FILES})

该应用程序必须是控制台类型的应用程序,并且没有GUI。

编辑:我的主要功能如下。

#include "gtest/gtest.h"
int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

我建议检查三点:

  1. 检查通过激活详细输出调用的命令行。 请参阅将CMake与GNU Make一起使用:如何查看确切的命令?
  2. 您确定代码中确实只有一个main()函数吗?
  3. 包含main()函数的源文件是否直接添加到add_executable()调用中?

因为我刚刚给您的代码尝试了Cygwin中提供的最新CMake软件包,所以它似乎可以正常工作(在main.cpp使用和不使用#include <windows.h> )。

希望可以帮助您找到问题,这是我所做的:

$ export PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin

$ cmake --version
cmake version 3.3.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).

$ c++ -v --version
c++ (GCC) 4.9.3
gcc-Version 4.9.3 (GCC)
GNU C (GCC) Version 4.9.3 (x86_64-pc-cygwin)
GNU assembler version 2.25 (x86_64-pc-cygwin) using BFD version (GNU Binutils) 2.25
GNU assembler (GNU Binutils) 2.25
GNU ld (GNU Binutils) 2.25

$ cmake ..
-- The CXX compiler identification is GNU 4.9.3
-- Check for working CXX compiler: /usr/bin/c++.exe
-- Check for working CXX compiler: /usr/bin/c++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found GTest: /cygdrive/c/gtest-1.7.0/lib/.libs/libgtest.a
-- Configuring done
-- Generating done
-- Build files have been written to: ...
Scanning dependencies of target binary_name
[ 50%] Building CXX object CMakeFiles/binary_name.dir/main.cpp.o
[100%] Linking CXX executable binary_name.exe
[100%] Built target binary_name

$ ./binary_name.exe
[==========] Running 0 tests from 0 test cases.
[==========] 0 tests from 0 test cases ran. (3 ms total)
[  PASSED  ] 0 tests.

我使用了以下CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
project(binary_name CXX)

enable_testing()

set(GTEST_ROOT /cygdrive/c/gtest-1.7.0)
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${GTEST_ROOT}/lib/.libs")

find_package(GTest REQUIRED)

add_executable(binary_name main.cpp)
target_include_directories(binary_name PRIVATE ${GTEST_INCLUDE_DIRS})
target_link_libraries(binary_name PRIVATE ${GTEST_LIBRARIES})

产生以下链接行CMakeFiles/binary_name.dir/link.txt

/usr/bin/c++.exe    
    -Wl,--enable-auto-import CMakeFiles/binary_name.dir/main.cpp.o  
    -o binary_name.exe 
    -Wl,--out-implib,libbinary_name.dll.a 
    -Wl,--major-image-version,0,--minor-image-version,0  
    /cygdrive/c/gtest-1.7.0/lib/.libs/libgtest.a 

更多参考

SDL或更广泛地结合使用时,大多数对类似问题的引用:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM