我在一个小型的C++项目中使用CMake,到目前为止它运行得很好......有一个转折:x
当我更改头文件时,通常需要重新编译许多源文件(直接或间接包含它们的文件),但是cmake似乎只检测了一些要重新编译的源文件,从而导致状态损坏.我可以通过消除项目并从头开始重建来解决这个问题,但这绕过了使用make实用程序的目标:只重新编译所需的内容.
因此,我想我做错了什么.
我的项目非常简单有条理:
主目录有:
cmake_minimum_required(VERSION 2.8)
project(FOO)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
# Compiler Options
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++0x -Wall -Wextra -Werror")
include_directories($(FOO_SOURCE_DIR)/include)
add_subdirectory(src)
"src"目录:
add_subdirectory(sub1)
add_subdirectory(sub2)
add_subdirectory(sub3)
add_subdirectory(sub4)
add_executable(foo main.cpp)
target_link_libraries(foo sub1 sub2 sub3 sub4)
哪sub4取决于sub3哪个取决于sub2哪个取决于sub1
以及子目录(sub3)的示例:
set(SUB3_SRCS
    File1.cpp
    File2.cpp
    File3.cpp
    File4.cpp
    File5.cpp
    File6.cpp
    )
add_library(sub3 ${SUB3_SRCS})
target_link_libraries(sub3 sub1 sub2)
我很高兴如果有人能把我的错误指向我,在这里搜索或在CMake上没有产生任何东西,所以我想这很容易或应该开箱即用......
(供参考,我在MSYS上使用cmake版本2.8.2)
编辑:
感谢Bill的建议,我已经检查了depend.makeCMake生成的文件,而且确实缺乏(严重).这是一个例子:
src/sub3/CMakeFiles/sub3.dir/File1.cpp.obj: ../src/sub3/File1.cpp
是的,这就是所有,包括的所有内容都被引用:x
我有一个项目,它使用CMake作为构建工具,并为我和我的同事制作了一个简单的模板.当我在网上搜索最好和易于使用的实践时,我遇到了制作图书馆的不同方法.
在这个模板中,我已经在两个单独的变量中列出了头文件和源文件,而我没有将头文件传递给add_library命令 - 只是源代码.然后我用set_target_properties用PUBLIC_HEADER变量给头文件列表.
到目前为止它似乎有效,但我想知道我是否正在制造不必要的复杂事物.有些人在线也给add_library命令提供头文件,甚至不使用set_target_properties等等.
简而言之:
add_library还是不应该(作为最佳实践)?以及两种用法的影响.(这是我正在谈论的模板:)
cmake_minimum_required(VERSION 3.1.0)
project(lae CXX C) 
set(CMAKE_CXX_STANDARD 14)
include_directories(
  ${CMAKE_CURRENT_SOURCE_DIR}
)
set(SOURCE_FILES
    ...
)
set(HEADER_FILES 
   ...
)
set( PRIVATE_HEADER_FILES
   ...
)
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ) 
set( REQUIRED_LIBRARIES
   ...
)
target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBRARIES} )
SET_TARGET_PROPERTIES( 
  ${PROJECT_NAME}  
PROPERTIES 
  FRAMEWORK ON
  SOVERSION 0
  VERSION 0.1.0
  PUBLIC_HEADER "${HEADER_FILES}"
  PRIVATE_HEADER "${PRIVATE_HEADER_FILES}"
  ARCHIVE_OUTPUT_DIRECTORY "lib"
  LIBRARY_OUTPUT_DIRECTORY "lib"
  OUTPUT_NAME ${PROJECT_NAME}
)
您好我想问你,如果有人知道如何在Makefile中添加头文件的目录以避免错误*.h找不到,我试过这个选项但不起作用:
INC_PATH := -I /directory/to/add
假设我有以下文件结构:
project/
  - src/
    - main.cpp
    moduleA/
      - moduleA.cpp
      - moduleA.hpp
    moduleB/
      - moduleB.cpp
      - moduleB.hpp
在 moduleB 中,我想使用 moduleA。因此,我想包括moduleA.hpp但作为src. 又名,我希望能够编写#include moduleA/moduleA.hpp以使用 moduleA。我可以控制所有文件,并且可以放入CMakeLists.txt或FindModule<>.cmake放入任何目录。
注意:我想这样做是因为每个模块中都有同名的文件(在本例中为parameters.hpp)。因此,parameters.hpp为了src便于阅读,我希望能够包含相对于目录,并确保包含正确的参数文件。
如果这令人困惑,或者需要任何其他信息,请询问。谢谢各位的帮助!
我在我的项目中使用子模块 GitHub,现在我想使用target_include_directoriesfor 将文件包含在我的项目类中
这是我的 cmake 配置
cmake_minimum_required(VERSION 3.9)
project(SpyCBlock)
set(CMAKE_CXX_STANDARD 14)
#bitcoin rpc lib
find_library(bitcoinapi 0.3 REQUIRED)
target_include_directories(rapidjson PUBLIC include/rapidjson/include)
target_include_directories(spycblockrpc PUBLIC include/spycblockrpc)
target_include_directories(btccryptography PUBLIC include/bitcoin-cryptography-library)
add_executable(
        ${PROJECT_NAME}
        #other inclusion file cpp
        #cpp-properties file include
        include/cpp-properties/src/Properties.cpp
        include/cpp-properties/src/PropertiesParser.cpp
        include/cpp-properties/src/PropertiesUtils.cpp
        #include bitcoin-cryptography-library
        include/bitcoin-cryptography-library/cpp/Sha256.cpp
        include/bitcoin-cryptography-library/cpp/Sha256Hash.cpp
        include/bitcoin-cryptography-library/cpp/Utils.cpp
        #include spycblocrpc
        include/spycblockrpc/core/graph/TransactionGraph.cpp
        include/spycblockrpc/core/graph/WrapperInformations.cpp
        include/spycblockrpc/ConfiguratorSingleton.cpp
        include/spycblockrpc/commands/DecodeScriptCommand.cpp
        include/spycblockrpc/commands/DecodeRawTransaction.cpp
        include/spycblockrpc/commands/HeightBlockchainCommand.cpp
        include/spycblockrpc/commands/DecodeBlockAtIndexCommand.cpp
)
#bitcoin rpc lib
target_link_libraries(SpyCBlockTests bitcoinapi)
target_link_libraries(${PROJECT_NAME} bitcoinapi)
运行 CMake 时出现此错误
Starting to parse CMake project.
CMake Error at CMakeLists.txt:20 (target_include_directories):
  Cannot specify include directories for …target_include_directories我正在阅读一个大项目的 cmakelist 文件,并对和 的用法感到困惑include_directories。
应该include_directories能够将所有头文件添加到编译器搜索的路径。但我仍然target_include_directories在子目录的 cmakelist 文件中看到一些内容,它们为特定目标指定了一些包含路径。  
谁能解释一下这两个的用法吗?就我而言,添加头文件的所有路径就include_directories足够了。
我目前在使用 Boost 时遇到问题。在CMake阶段,它清楚地说明发现了boost:
-- Boost version: 1.61.0
-- Found the following Boost libraries:
--   filesystem
--   program_options
--   iostreams
--   timer
--   system
--   regex
但是在make从生成的阶段中Makefile:
Timer.h(26): catastrophic error: cannot open source file "boost/timer/timer.hpp"
  #include <boost/timer/timer.hpp>
[..]                                  ^
Function.h(29): catastrophic error: cannot open source file "boost/ptr_container/ptr_map.hpp"
  #include <boost/ptr_container/ptr_map.hpp>
[..]
基本上,似乎没有Makefile找到boost. 我什至去声明Boost_INCLUDEDIR并且Boost_LIBRARYDIR- 区分大小写。看起来没有帮助。
可能的原因是什么?会不会是编译器,即gcc/icc和cmake生成器之间的一些冲突?(纯猜测 - 我在这方面不专业......)
编辑:这是boost在CMakeLists.txt文件中查找的过程:http : //pastebin.com/7m3yAYk5 …