CMake:如何处理同一个库的多个版本?

时间:2018-07-30 12:52:38

标签: cmake shared-libraries static-libraries rapidjson header-only

在我的项目中,我正在使用仅标头的库Rapidjson v1.1.0。

└── my_project
    ├── CMakeLists.txt
    ├── src
    │
    ├── 3rdParty/tiny_dnn (header only)
    │   ├── CMakeLists.txt
    │   ├── src
    │   └── rapidjson_v0.2
    │   
    └── rapidjson_v1.1.0

现在的问题是,tiny-dnn还包含了Rapidjson(但是较旧的版本),因此,当我尝试在主CMakeLists.txt中包含include_directories(${PROJECT_SOURCE_DIR}/3rdParty/tiny_dnn)之类的tiny_dnn时,任何微小的冲突都会引起冲突, dnn搜索我的rapidjson,或者我的项目搜索tiny-dnn的rapidjson。

my_project CMakeLists.txt

cmake_minimum_required(VERSION 3.9)
project(my_project)

# check the build type and set compiler and linker flags
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)
IF(CMAKE_BUILD_TYPE MATCHES DEBUG)
    message("Debug build")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-unknown-pragmas -g -O0 -std=c++17 -Ddeveloper_build")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIC -g -O0")

ELSEIF(CMAKE_BUILD_TYPE MATCHES RELEASE)
    message("Release build")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-unknown-pragmas -O3 -std=c++17")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -O3")

ELSE()
    message(FATAL_ERROR "No build type specified")
ENDIF()

find_package(Boost COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/3rdParty/tiny-dnn)

file(GLOB_RECURSE SOURCE_FILES src/*.cpp src/*.c)

set(SOURCE_FILES
        ${SOURCE_FILES})

add_executable(my_project ${SOURCE_FILES})
target_link_libraries(my_project ${Boost_LIBRARIES} pthread)
set_target_properties(my_project PROPERTIES SUFFIX ${CMAKE_BUILD_TYPE})

my_project.cpp

#include <tiny_dnn/tiny_dnn.h>
#include <rapidjson/rapidjson.h> // <- usr/local/include/rapidjson

int main(int argc, char **argv)
{
    rapidjson::Document d; // <- uses rapidjson (v0.2) of tiny_dnn/cereal/external/rapidjson but in my project i would use /usr/local/include/rapidjson (v1.0.1)

    return 0;
}

1 个答案:

答案 0 :(得分:0)

通常-不。强迫一个客户使用更高/更好。即使您解决了这些问题,也很可能会违反一个定义规则,稍后再进行段错误。