添加仅标头库时,嵌套CMake会出现多个定义错误

时间:2015-12-17 22:00:58

标签: c++ cmake

我的C ++库组织如下:

project(Domains)
cmake_minimum_required(VERSION 2.8)

add_subdirectory(IDomain)
add_subdirectory(Blackjack)

add_library(Domains STATIC)
target_link_libraries(Domains IDomain BLACKJACK)

每个库(即域)包含用于组织目的的链接和简单代码:

project (TAPKEE)
file(GLOB TAPKEE_INCLUDE
    "include/tapkee/*.hpp"
    "include/tapkee/callbacks/*.hpp"
    "include/tapkee/defines/*.hpp"
    "include/tapkee/external/*.hpp"
    "include/tapkee/neighbors/*.hpp"
    "include/tapkee/parameters/*.hpp"
    "include/tapkee/routines/*.hpp"
    "include/tapkee/traits/*.hpp"
    "include/tapkee/utils/*.hpp"
)
add_library(${PROJECT_NAME} header_only_BS.cpp ${TAPKEE_INCLUDE})

每个子库(即Blackjack)都有一个非常简单的CMakeLists.txt,它只是编译库(add_library)。

到目前为止,这一直很好。

我正在添加第三方库(http://tapkee.lisitsyn.me/)。这是一个仅限标头的库。看起来CMake不支持这个,但我发现了一些解决方法。我创建一个空的dummy.cpp文件。以下是第三方库的CMakeLists:

project(ManifoldLearning)
#Root
set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)

#Domains
set(BLACKJACK_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Domains/Blackjack/include)

set(TAPKEE_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libs/tapkee/include/)

include_directories(${INCLUDE_DIR} ${SRC_DIR})
include_directories(${TAPKEE_INCLUDE_DIR})
include_directories(${BLACKJACK_INCLUDE_DIR})

add_subdirectory(Domains)
#add_subdirectory(libs/tapkee)

add_executable(${PROJECT_NAME} ${SRC_LIST} ${HEADER_LIST})
target_link_libraries(${PROJECT_NAME} Domains)

这是奇怪的事情:我的main.cpp和根src目录中的任何东西都可以包含这个tapkee库,但是没有子库可以(即BlackJack)。我为tapkee中的函数获得了数千个重定义链接器错误。

以下是顶级CMakeLists的示例:

{{1}}

我已经被困在这几天了,任何帮助/建议都会受到赞赏。

更新:我已按照安东尼奥的指示删除了tapkee CMakeLists.txt(add_subdirectory)。我仍然得到重新定义错误,我觉得很奇怪。它现在没有在任何地方编译,只包含在BlackJack / src / foo1.cpp

0 个答案:

没有答案