gpt4 book ai didi

c++ - 我可以从多个目标创建一个库吗?

转载 作者:行者123 更新时间:2023-11-30 03:55:58 25 4
gpt4 key购买 nike

我正在尝试学习 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 还是工具链本身。感谢帮助:)

最佳答案

如果您只想创建一个没有源文件的核心 目标,您需要将其声明为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 安装版本。

然后,您将构建您的测试或任何可执行文件,直接与此接口(interface)目标链接:

add_executable(main main.cpp)
target_link_libraries(main core_interface)

关于c++ - 我可以从多个目标创建一个库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28789097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com