Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake将标题添加到项目文件_Cmake - Fatal编程技术网

CMake将标题添加到项目文件

CMake将标题添加到项目文件,cmake,Cmake,好的,我的root/CMakeLists.txt中有以下代码 cmake_minimum_required(VERSION 2.8) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE STRING "Debug or Release" FORCE) endif() if(CMAKE_CONFIGURATION_TYPES) set(CMAKE_CONFIGURATION_TYPES "Debug;Relea

好的,我的root/CMakeLists.txt中有以下代码

cmake_minimum_required(VERSION 2.8)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Debug or Release" FORCE)
endif()

if(CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configurations" FORCE)
    mark_as_advanced(CMAKE_CONFIGURATION_TYPES)
endif()

execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory install)
SET(CMAKE_INSTALL_PREFIX install)

project(efge)

# include
add_definitions(-DEFGE_EXPORTS)
include_directories("${CMAKE_SOURCE_DIR}/include/EFGE/"
            "${CMAKE_SOURCE_DIR}/include/EFGE/Math"
            "${CMAKE_SOURCE_DIR}/include/EFGE/System")

# preconf
set(EFGE_SHARED_LIBS TRUE CACHE BOOL "Shared libraries (needs shared SFML libraries, too)")

if(WIN32)
    set(EFGE_STATIC_STD_LIBS FALSE CACHE BOOL "Statically linked runtime/standard libraries? Must match with SFML-Option.")
    if(EFGE_STATIC_STD_LIBS)
        if(EFGE_SHARED_LIBS)
            message("\nEFGE_STATIC_STD_LIBS and EFGE_SHARED_LIBS aren\'t compatible!")
        elseif(MSVC)
            foreach(flag CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE)
                if(${flag} MATCHES "/MD")
                    string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}")
                endif()
            endforeach()
        elseif(CMAKE_COMPILER_IS_GNUCXX)
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
        endif()
    endif()
endif()

if(CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CSS_FLAGS} -std=c++0x")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -stdlib=libc++")
    add_definitions(-DEFGE_USE_STD_RANDOMENGINE)
endif()

set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules/;${CMAKE_MODULE_PATH}")

if(NOT EFGE_SHARED_LIBS)
    set(SFML_STATIC_LIBRARIES TRUE)
endif()
find_package(SFML 2 COMPONENTS audio graphics window system)

if(SFML_FOUND)
    include_directories(${SFML_INCLUDE_DIR})
else()
    set(SFML_ROOT "" CACHE PATH "SFML top-level directory")
    message("\n SFML directory not found. Please set SFML_ROOT to SFML top-level path, wich contains /include/ and /lib/ directories.")
    message("Make sure SFML libraries have the same configuration.")
endif()

# linking sfml
macro(efge_link_sfml EFGE_TARGET)
    target_link_libraries(${EFGE_TARGET} ${SFML_LIBRARIES})
endmacro()
macro(efge_link_sfml_dependencies EFGE_TARGET)
    target_link_libraries(${EFGE_TARGET} ${SFML_DEPENDENCIES})
endmacro()

macro(efge_link_efge EFGE_TARGET)
    target_link_libraries(${EFGE_TARGET} efge)
endmacro()

# source
add_subdirectory(src)

# include
install(DIRECTORY include
        DESTINATION .)
如果这很重要,我的文件结构如下:

+-- include
       +-- Math
            +--- *.hpp files
       +-- System
            +--- *.hpp files
       +--- *.hpp files
+-- src
     +--- *.cpp files
     +--- CMakeLists.txt
+--- CMakeLists.txt
如何将标题添加到生成的项目文件(例如代码块)?Makefile似乎工作正常。像
set\u group
这样的东西不会影响项目文件。
第一次使用CMake,我想不出来。谢谢

我刚刚检查了以下组合:

  • CMake 2.8.12.1
  • 代码块13.12
  • 代码块项目的生成如下所示:

    mkdir build
    cd build
    cmake -G 'CodeBlocks - Unix Makefiles' ..
    
    我确实看到生成器生成了一个.cbp文件,其中所有头文件都列在中。因此,您可以查看.cbp文件并检查是否列出了标题。如果不是,那么你应该检查你的蛋糕是否足够新鲜

    更新:

    啊哈,我明白了。看来我重现了你的发电机问题。以下是最小的非工作示例:

    project/
       CMakeLists.txt
       src/
            CMakeLists.txt
            test.cpp
       include/test.h
    
    project/CMakeLists.txt:

    cmake_minimum_required(VERSION 2.8)
    
    project(TestProject)
    
    include_directories(include)
    
    add_subdirectory(src)
    
    cmake_minimum_required(VERSION 2.8)
    
    project(TestProjectSources)
    
    set(SOURCES test.cpp)
    
    add_executable(test ${SOURCES})
    
    project/src/CMakeLists.txt:

    cmake_minimum_required(VERSION 2.8)
    
    project(TestProject)
    
    include_directories(include)
    
    add_subdirectory(src)
    
    cmake_minimum_required(VERSION 2.8)
    
    project(TestProjectSources)
    
    set(SOURCES test.cpp)
    
    add_executable(test ${SOURCES})
    
    project/src/test.cpp

    #include "test.h"
    
    int main(void) {
        TestRun r;
        r.run();
        return 0;
    }
    
    项目/包括/测试。h:

    #ifndef _TEST_H_
    #define _TEST_H_
    
    #include <iostream>
    
    class TestRun {
    public:
        TestRun() { std::cout << "Hello World!" << std::endl; }
        void run() { std::cout << "Doing something useful" << std::endl; }
    };
    
    #endif // _TEST_H_
    

    因此,正如您所看到的,只有当
    test.cpp
    test.h
    并排驻留在一个目录中时,这种方法才有用。因此,这是进一步改进的方向。我可以建议联系这个论坛帖子的人,讨论如何改善这种情况。在项目生成时调用
    gcc-MM-I test.cpp可能是合理的,但这种方法成本很高,如果此时无法编译代码,则很容易被破坏。

    通常CMake不处理头文件(不像MSVC那样明确列出头文件),它在
    include\u目录
    级别上运行。您可以另外提及它们,例如形成正确的安装顺序。你需要它们的目的是什么?我只是在另一个项目中看到它们被添加,并且认为这是有必要的。CMake是否做了一些特殊的事情使其变得不必要?好吧,从技术上讲,构建系统只传递给编译器源文件(.c/.cpp)和包含目录,其余由编译器自己执行(更准确地说,是它的预处理器,
    cpp
    )。安装阶段可能需要更高的头文件,您可能需要在
    install
    CMake指令中指定它们。如前所述,各种IDE对项目文件和其他实体的处理/显示方式各不相同。例如,KDevelop和EclipseCDT显示项目目录中的所有文件,而Code::Blocks根本不显示?这是一种奇怪的行为。。。