2017-07-29 111 views
2

首先,我是CMake的新手。CMake在Visual Studio下构建问题

文件夹结构

root_project 
    |─── CMakeLists.txt 
    |─── build 
    |─── Project 1 
    |  |─── build 
    |  |  |─── Debug 
    |  |  └─── Release 
    |  |─── CMakeLists.txt 
    |  |─── source 
    |  |  └─── include 
    |  |─── resource 
    |  └─── header 
    └─── Project 2 
     |─── build 
     |  |─── Debug 
     |  └─── Release 
     |─── source 
     |  |─── CMakeLists.txt 
     |  └─── include 
     |─── resource 
     └─── header 

CMake的文件

的的CMakeLists.txt为root_project:

# Specify the minimum version for CMake 
cmake_minimum_required(VERSION 3.8.2 FATAL_ERROR) 

# Project's name 
project("RootProject X") 

IF(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) 
    message(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt.") 
ENDIF() 

OPTION(BUILD_TESTS "Decides whether the unit tests will be built." ON) 

# C/C++ languages required. 
enable_language(C) 
enable_language(CXX) 

set(CMAKE_C_STANDARD 11) 
set(CMAKE_C_STANDARD_REQUIRED ON) 
set(CMAKE_C_EXTENSIONS OFF) 

set(CMAKE_CXX_STANDARD 14) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 
set(CMAKE_CXX_EXTENSIONS OFF) 

# Only allow 64bit architecture 
IF(CMAKE_SIZEOF_VOID_P EQUAL 8) 
    # 64bit 
    message(STATUS "Compiling for x86-64 platform. Proceeding...") 
ELSEIF(CMAKE_SIZEOF_VOID_P EQUAL 4) 
    # 32bit 
    message(FATAL_ERROR "Compiling for x86 platform. This is not supported. Aborting...") 
ELSE() 
    # unidentified architecture 
    message(FATAL_ERROR "Running on unidentified architecture. This is not supported. Aborting...") 
ENDIF() 

# Abort when OpenGL is not found 
FIND_PACKAGE(OpenGL 4.5 REQUIRED) 

IF(NOT VULKAN_FOUND) 
    message(WARNING "Could not find Vulkan library.") 
ENDIF() 

# Add the modules 
add_subdirectory("Project 1") 
add_subdirectory("Project 2") 

的CMakeLists项目1:

# Specify the minimum version for CMake 
cmake_minimum_required(VERSION 3.8.2 FATAL_ERROR) 

project("Project 1") 

# Set the version number of the project here 
set(VERSION_MAJOR "0") 
set(VERSION_MINOR "1") 
set(VERSION_PATCH "0") 
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) 

find_package(OpenGL 4.5 REQUIRED) 

include_directories(${OPENGL_INCLUDE_DIR}) 
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/sources/third-party-include/) 
link_libraries(${OPENGL_gl_LIBRARY}) 
add_definitions(${OpenGL_DEFINITIONS}) 

#include_directories(${CMAKE_CURRENT_SOURCE_DIR}/sources/include/) 

# ToDo: Testing 
set(HEADERS 
    ${CMAKE_CURRENT_SOURCE_DIR}/sources/include/Engine.h 
) 

set(SOURCES 
    ${CMAKE_CURRENT_SOURCE_DIR}/source/Engine.cpp 
) 

source_group(headers FILES ${HEADERS}) 
source_group(sources FILES ${SOURCES}) 

if(WIN32) 
# currently add_executable for testing purpose 
add_executable("Project 1" WIN32 
    #${HEADERS} 
    ${SOURCES} 
) 
ELSEIF(UNIX AND NOT APPLE) 
add_library("Project 1" 
    ${HEADERS} 
    ${SOURCES} 
) 
ELSE() 
# The system is not supported 
message(FATAL_ERROR "System not supported.") 
ENDIF() 

target_link_libraries(DarkEngine ${OPENGL_gl_LIBRARY}) 

的CMakeLists为项目2 :

# Specify the minimum version for CMake 
cmake_minimum_required(VERSION 3.8.2 FATAL_ERROR) 

project("Project 2") 

# Set the version number of the project here 
set(VERSION_MAJOR "0") 
set(VERSION_MINOR "1") 
set(VERSION_PATCH "0") 
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) 

set(HEADERS 

) 

set(SOURCES 

) 

source_group(headers FILES ${HEADERS}) 
source_group(sources FILES ${SOURCES}) 

add_executable("Project 2" WIN32 
    ${HEADERS} 
    ${SOURCES} 
) 

target_link_libraries("Project 2" "Project 1") 

问题/问题

注:我试图实现外的源代码编译,其中重点项目1是从项目2

命令我使用的引擎下root_project的构建运行:cmake .. -G "Visual Studio 15 2017 Win64"

  • 项目2对项目1
  • 没有链接210
  • 项目2不VS显示2017年
  • 我自己的头文件在/包括项目1将显示在外部相关性在2017年VS而非源代码
+0

在CMake的<-> VS方面的项目=解决方案和目标=项目 – tambre

+0

虽然我想提一提,我喜欢的质量这个问题。保持良好的工作! :) – tambre

+0

我总是尝试构建我的帖子以获得更高的质量。所以,根据您的评论,我应该怎样做才能解决我的问题? – ShadowDragon

回答

1

可以把我的评论到一个答案

您只需指定Project 2目标的来源。

我给了你一个例子,CMake给你一个配置错误(这可能是为什么它不会显示/不重写解决方案/项目文件,如果你添加第二个项目):

CMake Error at CMakeLists.txt:23 (add_executable): 
    add_executable called with incorrect number of arguments, no sources provided 

是的,如果你添加eg一个尚未现有src/main.cppSOURCES您将获得:

CMake Error at CMakeLists.txt:23 (add_executable): 
    Cannot find source file: 

    src/main.cpp 

    Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx 

所以在C进行工作流程总是先创建源文件,然后添加到您的CMakeLists.txt。使用像VS这样的IDE,你可以在你的项目中添加一个新项目(就像你对非生成项目所做的那样),然后将它添加到你的CMakeLists.txt文件中。

对于我的一些项目,我创建了一个check_and_create_source()函数,在被覆盖的add_executable()调用中调用,但使用它几年后,我现在可以说在这种方法中没有真正的好处。在开始之前,您仍然需要运行ZERO_CHECK构建以获取创建的空文件(并且在错误输入现有源文件的包含时会感到困惑)。

,我个人不喜欢通配符替代(见Why is cmake file GLOB evil?CMake/Ninja attempting to compile deleted `.cpp` file

+0

你也有关于第1点和第3点的想法吗? – ShadowDragon

+0

@ShadowDragon您能否详细了解您所遇到的问题,当我使用“项目2”的源代码/头文件进行测试时,它似乎可行?我刚刚遇到CMake未接受“Project 2”作为“保留名称”。所以我不得不重新命名为例如“Project2的”。对于最后一点,您必须将您希望在IDE项目中的所有标题作为源提供,否则它们将仅显示为“外部依赖项”。 – Florian

+0

**要点3:**所以我必须明确地将它们添加到'add_executable'命令?如何在不将完整的相对路径放入CMakeLists.txt文件的情况下列出这些头文件。例如,我只需编写'Engine.h'而不是'sources/include/Engine.h'。一般来说,也很高兴知道这个源文件。 **要指向1:** VS例如不能在项目2中包含项目1的任何文件。注意:项目2只有一个没有代码的main.cpp,因此它显示在VS中。 – ShadowDragon