【问题标题】:How to tell CMake when using add_library to not include a specific object file使用 add_library 时如何告诉 CMake 不包含特定的目标文件
【发布时间】:2015-06-29 15:20:15
【问题描述】:

我正在尝试制作一个静态库,例如my_lib.a。 这个库依赖于一个 gSoap 代码 - file2.cpp.o,这是因为这个 CMake 指令(和 2 个自定义命令)而生成的:

add_library(${TARGET_NAME} ${SRC_FILES}
    ${GENERATED_SRC_FILES} ${GENERATED_H_FILES} ${GENERATED_RES_FILES})

file2.cpp 存在于GENERATED_SRC_FILES 中。在链接之前一切都运行良好。

/usr/bin/ar cr ../lib/my_lib.a CMakeFiles/my_lib.dir/src/file1.cpp.o CMakeFiles/my_lib.dir/src/file2.cpp.o

如果我让 Make 使用这个命令,库 my_lib.a 将包含 file1.cpp.ofile2.cpp.o。但实际上我不需要file2.cpp.o 在我的 *.a 库中。

有谁知道我必须如何管理此案例以获取仅包含 file1.cpp.omy_lib.a

【问题讨论】:

  • 我会写一个从${GENERATED_SRC_FILES}中删除file2.cpp的宏
  • 或者只是列出(REMOVE_ITEM GENERATED_SRC_FILES file2.cpp)
  • 感谢您的想法! :) 我在调用 add_library() 之前尝试使用“list(..)”,但它对链接状态没有影响......你说的创建宏是什么意思?当我检查 GENERATED_SRC_FILES 的内容时,它包含 .cpp/.c 文件,但不包含目标文件 *.o。这意味着,对我来说,链接是完全不同的过程......
  • 如果您从列表中删除 cpp 文件,则它不会被编译为库的一部分,因此您不必担心 .o 文件。
  • 我在 CMake 中看到了什么是宏,我不知道这个功能:) 谢谢你的想法,我会试试的。

标签: c++ linker cmake gsoap


【解决方案1】:

我想我找到了解决办法。 这个想法是编译一些具有不同目标的 *.o 文件,这不是官方目标。比在官方目标中,您可以将这些您认为重要的文件放在一起。就我而言,我只有一个不想包含在 *.a 文件中的文件。所以:

第一个目标是:

add_library(gSoap_files OBJECT ${GENERATED_SRC_FILES} ... )

官方是:

add_library(${TARGET_NAME} ${SRC_FILES})

我从这个页面启发了自己:

http://www.cmake.org/Wiki/CMake/Tutorials/Object_Library

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2018-08-24
    • 2011-09-13
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多