相关疑难解决方法(0)

使用cmake处理头文件依赖项

我在一个小型的C++项目中使用CMake,到目前为止它运行得很好......有一个转折:x

当我更改头文件时,通常需要重新编译许多源文件(直接或间接包含它们的文件),但是cmake似乎只检测了一些要重新编译的源文件,从而导致状态损坏.我可以通过消除项目并从头开始重建来解决这个问题,但这绕过了使用make实用程序的目标:只重新编译所需的内容.

因此,我想我做错了什么.

我的项目非常简单有条理:

  • 所有资源都在的顶级目录,主CMakeLists.txt就在那里
  • 所有公共标题所在的"include"目录(在各个子目录中)
  • 一个"src"目录,其中源文件的所有子目录都是,src CMakeLists.txt就在那里
  • "src"目录中每个子目录的CMakeLists.txt

主目录有:

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)
Run Code Online (Sandbox Code Playgroud)

"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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

我很高兴如果有人能把我的错误指向我,在这里搜索或在CMake上没有产生任何东西,所以我想这很容易或应该开箱即用......

(供参考,我在MSYS上使用cmake版本2.8.2)

编辑:

感谢Bill的建议,我已经检查了depend.makeCMake生成的文件,而且确实缺乏(严重).这是一个例子:

src/sub3/CMakeFiles/sub3.dir/File1.cpp.obj: ../src/sub3/File1.cpp
Run Code Online (Sandbox Code Playgroud)

是的,这就是所有,包括的所有内容都被引用:x

c++ dependencies cmake header-files

46
推荐指数
2
解决办法
5万
查看次数

为什么在CMake中将头文件添加到ADD_LIBRARY/ADD_EXECUTABLE命令中

我有一个项目,它使用CMake作为构建工具,并为我和我的同事制作了一个简单的模板.当我在网上搜索最好和易于使用的实践时,我遇到了制作图书馆的不同方法.

在这个模板中,我已经在两个单独的变量中列出了头文件和源文件,而我没有将头文件传递给add_library命令 - 只是源代码.然后我用set_target_propertiesPUBLIC_HEADER变量给头文件列表.

到目前为止它似乎有效,但我想知道我是否正在制造不必要的复杂事物.有些人在线也给add_library命令提供头文件,甚至不使用set_target_properties等等.

简而言之:

  • 我们应该包括头文件add_library还是不应该(作为最佳实践)?以及两种用法的影响.
  • 通过在add_library/add_executable中添加标题来实现目的是什么?因为即使没有它它们似乎也在工作(似乎只有前向声明和符号).请在理解上确认.

(这是我正在谈论的模板:)

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}
)
Run Code Online (Sandbox Code Playgroud)

cmake

30
推荐指数
1
解决办法
2万
查看次数

在Makefile中添加标头的目录

您好我想问你,如果有人知道如何在Makefile中添加头文件的目录以避免错误*.h找不到,我试过这个选项但不起作用:

INC_PATH := -I /directory/to/add
Run Code Online (Sandbox Code Playgroud)

makefile header include

23
推荐指数
2
解决办法
7万
查看次数

CMake:C++ 包含相对于基目录

假设我有以下文件结构:

project/
  - src/
    - main.cpp
    moduleA/
      - moduleA.cpp
      - moduleA.hpp
    moduleB/
      - moduleB.cpp
      - moduleB.hpp
Run Code Online (Sandbox Code Playgroud)

在 moduleB 中,我想使用 moduleA。因此,我想包括moduleA.hpp但作为src. 又名,我希望能够编写#include moduleA/moduleA.hpp以使用 moduleA。我可以控制所有文件,并且可以放入CMakeLists.txtFindModule<>.cmake放入任何目录。

注意:我想这样做是因为每个模块中都有同名的文件(在本例中为parameters.hpp)。因此,parameters.hpp为了src便于阅读,我希望能够包含相对于目录,并确保包含正确的参数文件。

如果这令人困惑,或者需要任何其他信息,请询问。谢谢各位的帮助!

c++ cmake include

8
推荐指数
1
解决办法
1万
查看次数

Cmake 使用 target_include_directories 时无法指定包含目录

我在我的项目中使用子模块 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)
Run Code Online (Sandbox Code Playgroud)

运行 CMake 时出现此错误

Starting to parse CMake project.
CMake Error at CMakeLists.txt:20 (target_include_directories):
  Cannot specify include directories for …
Run Code Online (Sandbox Code Playgroud)

c++ cmake

6
推荐指数
1
解决办法
1万
查看次数

CMAKE:target_include_directories 和 include_directories

target_include_directories我正在阅读一个大项目的 cmakelist 文件,并对和 的用法感到困惑include_directories

应该include_directories能够将所有头文件添加到编译器搜索的路径。但我仍然target_include_directories在子目录的 cmakelist 文件中看到一些内容,它们为特定目标指定了一些包含路径。

谁能解释一下这两个的用法吗?就我而言,添加头文件的所有路径就include_directories足够了。

cmake

5
推荐指数
1
解决办法
3万
查看次数

CMake 找到了 Boost 但 Make 找不到包含文件

我目前在使用 Boost 时遇到问题。在CMake阶段,它清楚地说明发现了boost:

-- Boost version: 1.61.0
-- Found the following Boost libraries:
--   filesystem
--   program_options
--   iostreams
--   timer
--   system
--   regex
Run Code Online (Sandbox Code Playgroud)

但是在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>
[..]
Run Code Online (Sandbox Code Playgroud)

基本上,似乎没有Makefile找到boost. 我什至去声明Boost_INCLUDEDIR并且Boost_LIBRARYDIR- 区分大小写。看起来没有帮助。

可能的原因是什么?会不会是编译器,即gcc/icccmake生成器之间的一些冲突?(纯猜测 - 我在这方面不专业......)

编辑:这是boostCMakeLists.txt文件中查找的过程:http : //pastebin.com/7m3yAYk5 …

c++ boost makefile cmake

3
推荐指数
1
解决办法
2308
查看次数

标签 统计

cmake ×6

c++ ×4

include ×2

makefile ×2

boost ×1

dependencies ×1

header ×1

header-files ×1