【发布时间】:2018-02-03 09:33:03
【问题描述】:
我有一个依赖于多个第三方库的框架。我想轻松分享我的框架。例如,用户只需要我的包含和添加我的库来使用我的框架,而不是所有的依赖项。
我使用 CMake 创建我的库,但我仍在尝试了解它是如何工作的。
项目的层次结构
test
├── CMakeLists.txt
├── libA
│ ├── CMakeLists.txt
│ ├── libA.cpp
│ ├── libA.hpp
├── libB
│ ├── CMakeLists.txt
│ ├── libB.cpp
│ ├── libB.hpp
└── test
├── CMakeLists.txt
└── main.cpp
libB 依赖于 libA,我想只添加 libB 以使项目正常运行。
位于test/的主CMakeLists.txt的内容:
cmake_minimum_required (VERSION 2.8.11)
project (C CXX)
include(CheckCXXCompilerFlag)
add_subdirectory("libA")
add_subdirectory("libB")
add_subdirectory("test")
位于 test/libA 中的主 CMakeLists.txt 的内容:
cmake_minimum_required (VERSION 2.8.11)
project (A CXX)
include(CheckCXXCompilerFlag)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++14")
file(GLOB SOURCES "*.cpp")
add_library(A STATIC ${SOURCES})
位于test/libB的主CMakeLists.txt的内容:
cmake_minimum_required (VERSION 2.8.11)
project (B CXX)
include(CheckCXXCompilerFlag)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++14")
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-static")
include_directories("../libA")
link_directories("../libA")
file(GLOB SOURCES "*.cpp")
add_library(B STATIC ${SOURCES})
target_link_libraries(B A)
位于 test/test 中的主 CMakeLists.txt 的内容:
cmake_minimum_required (VERSION 2.8.11)
project (C CXX)
include(CheckCXXCompilerFlag)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++14")
include_directories(../libA)
include_directories(../libB)
link_directories(../build/libB)
link_directories(../build/libA)
add_executable(C main.cpp)
target_link_libraries(C B)
如果我运行主 CMake 一切正常,则独立生成良好。 但是,如果我只想通过进入 test/test 并运行“cmake . && make”来创建 exe,我对 addL(int, int) 有一个未定义的引用。为了使它起作用,我必须在 CMakeLists 的末尾添加 target_link_libraries(CA)。正常吗?是否可以只添加主库而不添加其依赖项?
【问题讨论】:
标签: c++ ubuntu cmake libraries