CMake的将报头添加project文件(CMake Adding Headers to Proje

2019-10-19 07:26发布

好了,所以我有我的根/的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

我怎样才能将头添加到我的生成project文件(例如代码块)? Makefile中似乎很好地工作。 一样的东西set_group不影响project文件。 我无法弄清楚,使用CMake的首次。 谢谢!

Answer 1:

我刚刚检查了以下组合:

  1. CMake的2.8.12.1
  2. 代码块13.12

代码块项目产生如下:

mkdir build
cd build
cmake -G 'CodeBlocks - Unix Makefiles' ..

我也看到,发电机产生与中列出的所有头文件.cbp文件,所以你可以查看.cbp文件,并检查是否标头上市。 如果他们没有,那么你应该检查你的CMake足够的新鲜。

更新

AHHA,我明白了。 看来我已经与发电机转载您的问题。 下面是最小的非工作示例:

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

项目/的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

project(TestProject)

include_directories(include)

add_subdirectory(src)

项目/ src目录/的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

project(TestProjectSources)

set(SOURCES test.cpp)

add_executable(test ${SOURCES})

项目/ src目录/ TEST.CPP

#include "test.h"

int main(void) {
    TestRun r;
    r.run();
    return 0;
}

项目/包括/ test.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_

在这种情况下,发生器产生TestProject.cbp W / O型的任何头文件。 让我们看看如何这个问题能解决。

UPDATE2:嗯,我对你有一些坏消息。 不幸的是负责搜索和添加的头文件的代码块生成的代码块是太简单了,正确处理您的案件。 下面是从注释Source/cmExtraCodeBlocksGenerator.cxx从CMake的来源:

// The following loop tries to add header files matching to implementation
// files to the project. It does that by iterating over all source files,
// replacing the file name extension with ".h" and checks whether such a
// file exists. If it does, it is inserted into the map of files.
// A very similar version of that code exists also in the kdevelop
// project generator.

所以你可能会看到这种做法是有益的,只有test.cpptest.h并排位于一侧,在一个目录。 因此,它是继续改进的方向。 我建议从这个论坛主题联系的人http://forums.codeblocks.org/index.php?topic=16892.0和讨论的情况如何改善。 也许是合理的涉及gcc -MM -I<include directories> test.cpp调用时的项目生成,但这种方法是昂贵的,可能容易折断,如果代码不能在此刻进行编译。



文章来源: CMake Adding Headers to Projectfile
标签: cmake