我可以从多个目标制作一个库吗

Can I make a library from multiple targets?

本文关键字:一个 目标 我可以      更新时间:2023-10-16

我正在尝试学习cmake,并已开始将旧的make项目转换为cmake。以下是我现在拥有的目录结构的简化版本:

CMakeLists.txt
  src/
    CMakeLists.txt
    main.cpp
    core/
      CMakeLists.txt
      /sourcecode, other cmakes, etc.
  test/
    CMakeLists.txt
    someTest.cpp

目前,在我的根CMakeLists.txt文件中,我只拥有以下内容:

cmake_minimum_required(VERSION 2.8)
project(all)
add_subdirectory(src)
add_subdirectory(test)

我想做的是让core/CMakeLists.txt创建一个库,src/CMakeLists.txt可以使用它来构建主可执行文件,test/CMakeLists也可以加载它来构建单元测试。

所以我的src/core/CMakeLists.txt文件目前看起来有点像这样:

cmake_minimum_required(VERSION 2.8)                                             
project(core)                                                                   
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wpedantic -Wreorder -DBOOST_TEST_DYN_LINK -DBOOST_LOG_DYN_LINK ")
#some other directories in my core code:                                                          
add_subdirectory(display)                                                       
add_subdirectory(training)                                                      
add_subdirectory(utility)                                                       
#some packages I use...  
find_package(Boost 1.55.0                                                       
    COMPONENTS                                                                  
    log                                                                         
    program_options                                                             
    serialization                                                               
    thread                                                                      
    system                                                                      
    filesystem                                                                  
    REQUIRED)                                                                   
find_package(GLUT REQUIRED)                                                     
find_package(OpenGL REQUIRED)                                                   
find_package(Eigen3 REQUIRED)
include_directories(                                                            
    ${PROJECT_SOURCE_DIR}                                                       
    ${EIGEN3_INCLUDE_DIR})                                                      
target_link_libraries(core                                                                                                                           
    display                                                                     
    training                                                                    
    utility                                                                     
    ${Boost_LIBRARIES}                                                          
    ${OPENGL_LIBRARIES}                                                         
    ${GLUT_LIBRARY}                                                             
    ${OpenMP_LIBRARIES})                                                        

因此,我的想法是,我现在有了一个core目标,我可以简单地链接它来运行我的测试,一切都应该正常。然而,例如,当我尝试构建main时,我得到:

Cannot specify link libraries for target "core" which is not built by this
  project.

我想这可能是因为core没有add_library命令,但如果我添加add_library(core),我会得到这个错误:

You have called ADD_LIBRARY for library core without any source files. This typically indicates a problem with your CMakeLists.txt file

但我不想添加任何源文件;我只想让这个目标链接core目录中的目标,并从test生成一个我可以链接的目标。

很明显,我在这里缺少了一些核心知识,无论是cmake还是工具链本身。感谢您的帮助:)

如果只想创建一个没有源文件的core目标,则需要像INTERFACE对象一样声明它。因此,尝试将以下代码添加到您的src/core/CMakeLists.txt:

cmake_minimum_required(VERSION 3.0) # REQUIRED 3.x.x version                                             
project(core)                                                                   
...
# Here declare your core_interface target
add_library(core_interface INTERFACE)                                                   
target_link_libraries(core_interface INTERFACE                                                                                                                           
    display                                                                     
    training                                                                    
    utility                                                                     
    ${Boost_LIBRARIES}                                                          
    ${OPENGL_LIBRARIES}                                                         
    ${GLUT_LIBRARY}                                                             
    ${OpenMP_LIBRARIES})  

正如你所看到的,如果你这样做,你需要升级你的CMake安装版本。

然后,你将构建你的测试或任何可执行文件,直接与这个接口目标链接:

add_executable(main main.cpp)
target_link_libraries(main core_interface)         
相关文章: