当前位置: 首页 > 知识库问答 >
问题:

我应该只对原始cpp文件使用add_executable(),还是通过add_library()创建库?

林丁雷
2023-03-14

我正在学习Cmake,我有点挣扎。我的“项目”使用JsonCpp“库”,它是作为一个. cpp文件和两个. h文件提供的。结构如下:

myProject
    build/

    json/
       CMakeLists.txt
       jsoncpp.cpp
       include/
           json.h
           json-forward.h

    CMakeLists.txt 
    main.cpp

创建/创建CMakeLists。txt:

cmake_minimum_required(VERSION 3.6.0)
project(myProject)
add_subdirectory(json)
add_executable(app main.cpp)
target_link_libraries(app PRIVATE json)
# add_executable(app main.cpp json/jsoncpp.cpp json/include/json.h json/include/json-forwards.h)

json/CMakeLists。txt:

cmake_minimum_required(VERSION 3.6.0)

add_library(
    json
    jsoncpp.cpp
    include/json.h
    include/json-forwards.h
)

target_include_directories(json PUBLIC '${CMAKE_CURRENT_SOURCE_DIR}/include')

对所有. cpp文件只使用add_executable()和使用将jsoncpp转换为静态库并链接它的target_link_libraries有什么区别?我应该选择什么方法?

下一个让我困惑的是target_include_directories()。使用这个函数有什么好处?如果我注释它,并运行cmake(然后是makefile并启动应用程序),一切仍然正常。如果我从add_library()中删除“包括/json. h”“包括/json-prod. h”,一切仍然正常。

共有1个答案

田硕
2023-03-14

对所有. cpp文件只使用add_executable()和使用将jsoncpp转换为静态库并链接它的target_link_libraries有什么区别?我应该选择什么方法

当您有两个使用相同jsoncpp代码的可执行文件时,需要使用add_library。在这种情况下,如果您在两个add_executable()调用中都列出了jsoncpp源代码,您必须编译两次。将它们分组到add_library()将使它只编译一次,然后链接到两个可执行文件。

使用add_library的另一个原因纯粹是模块的逻辑组合。

 类似资料:
  • 我正在启动一个JavaScript项目,它的父目录包含两个文件夹:和。这两个都需要Javascript包,但我不知道是应该在它们各自的依赖项中创建一个文件夹,还是应该只创建一个并在其中安装所有包。基本上我问的是我是否应该这样做: 或者这个:

  • 问题内容: 我使用Ubuntu进行开发和部署,并且需要创建一个隔离的环境。 我正在考虑为此目的使用Vagrant或Docker。优缺点是什么,或者这些解决方案相比如何? 问题答案: 如果您的目的是隔离,那么我认为Docker是您想要的。 Vagrant是虚拟机经理。它允许您编写虚拟机配置和配置脚本。但是,它仍然是虚拟机,取决于VirtualBox(或其他),具有巨大的开销。它要求您拥有一个巨大的硬

  • 问题内容: 我正在自动化一个点网核心构建 给定Jenkins文件中的以下代码片段,我将为我拥有的每个测试项目生成一个XML文件。在接下来的步骤中,我要处理这些XML文件。 詹金斯提供了两种选择。我很困惑使用哪个选项。我使用“过程”还是“发布”?两者都为阈值提供了相同的选项,两者似乎都执行相同的操作。他们俩都标记了构建失败,他们都向詹金斯提供了一份测试报告。这是遗产吗?还是他们有自己目的的完全不同的

  • 问题内容: 我对于应该使用javascript创建对象的方式感到困惑。似乎至少有两种方法。一种是使用对象文字符号,而另一种是使用构造函数。有一个相对于另一个的优势吗? 问题答案: 如果您没有与对象相关联的行为(即,如果对象只是数据/状态的容器),则可以使用对象文字。 运用KISS原则。如果除了简单的数据容器之外不需要任何其他内容,请使用简单的文字。 如果要向对象添加行为,则可以使用构造函数并在构造

  • 问题内容: 我正在使用c / c 为osx和linux开发命令行界面可执行文件。该项目将链接到opencv。我应该使用libc 还是libstdc ++? 问题答案: 我会为每个操作系统使用本机库,即GNU / Linux上的libstdc 和Mac OS X上的libc 。 libc 在GNU / Linux上不是100%完整的,而libstdc 更完整时使用libc并没有真正的优势。另外,如果

  • 问题内容: 和CSS 和有什么不一样?我应该使用哪一个?为什么? 问题答案: 所有这些答案似乎都是不正确的。与直觉相反,在CSS 中不是pixel 。至少不是在简单的物理意义上。 从W3C,EM,PX,PT,CM,IN…阅读本文,了解如何为CSS发明一个“神奇的”单元。的含义因硬件和分辨率而异。(该文章是最新的,最新更新为2014-10。) 我自己的思考方式: px单位是CSS的魔术单位。它与当前