Cmake 在编译特定的生成源文件时,如何指定要使用的include目录?

Cmake 在编译特定的生成源文件时,如何指定要使用的include目录?,cmake,Cmake,我的CMakeLists.txt文件中有: add_custom_command(OUTPUT chattr.tab.cpp DEPENDS table_gen COMMAND ./table_gen > chattr.tab.cpp ) 这会将生成的源文件chattr.tab.cpp放在对象目录中(这是我想要的)。但是,结果是#include“someheader.h”在chattr.tab.cpp中找不到源目录中的标题 此生成的文件仅添加到某些目标。在编译生成的源文件时(到C

我的
CMakeLists.txt文件中有:

add_custom_command(OUTPUT chattr.tab.cpp
  DEPENDS table_gen
  COMMAND ./table_gen > chattr.tab.cpp
)
这会将生成的源文件
chattr.tab.cpp
放在对象目录中(这是我想要的)。但是,结果是
#include“someheader.h”
chattr.tab.cpp
中找不到源目录中的标题

此生成的文件仅添加到某些目标。在编译生成的源文件时(到
CMakeFiles/sometarget.dir/chattr.tab.cpp.o
),以及仅在编译该源文件时,是否有方法导致添加一些include目录?而不是将include目录添加到所有使用它的目标?后者需要添加多个
target\u include\u目录()

编辑:

根据squareskittles的回答,我生成了以下CMakeLists.txt文件(仅显示底部):

但这导致:

[ 51%] Generating chattr.tab.cpp
./table_gen > chattr.tab.cpp
[ 54%] Generating chattr.tab.cpp
./table_gen > chattr.tab.cpp
显然,因为
tstpgnread
tstpgn
都链接到
chattr.tab.cpp
,所以它会生成两次?!这是CMake中的错误还是我做错了什么?

与“”帖子一样,您可以修改单个文件的源文件属性:

set_source_files_properties(chattr.tab.cpp PROPERTIES 
    INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/other/include/dir
)

我最终创建了一个生成的源文件的对象库,然后与之“链接”:

...
#================================================================
# GENERATED SOURCE FILES
#

add_executable(table_gen table_gen.cxx)

add_custom_command(OUTPUT chattr.tab.cpp
  DEPENDS table_gen
  COMMAND ./table_gen > chattr.tab.cpp
)

add_custom_command(OUTPUT PgnGrammar.h
  DEPENDS generate_PgnGrammar.h.sh
  COMMAND ${CMAKE_CURRENT_LIST_DIR}/generate_PgnGrammar.h.sh
)

add_library(generated_ObjLib OBJECT)
target_sources(generated_ObjLib
  PRIVATE
    "chattr.tab.cpp"
    "PgnGrammar.h"
)

target_include_directories(generated_ObjLib
  PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}" # For local header files.
)

add_library(generated::sources ALIAS generated_ObjLib)

#==================================================================
# TEST EXECUTABLES
#

add_executable(tstchessposition tstchessposition.cxx)
target_link_libraries(tstchessposition PRIVATE CWChessboard::position AICxx::cwds)

add_executable(tstbenchmark tstbenchmark.cxx)
target_link_libraries(tstbenchmark PRIVATE CWChessboard::position AICxx::cwds)

add_executable(tstpgnread tstpgnread.cxx PgnDatabase.cxx MemoryBlockList.cxx)
target_link_libraries(tstpgnread PRIVATE generated::sources CWChessboard::position AICxx::cwds)

add_executable(tsticonv tsticonv.cxx)
target_link_libraries(tsticonv PRIVATE PkgConfig::glibmm)

add_executable(tstpgn tstpgn.cxx PgnDatabase.cxx MemoryBlockList.cxx)
target_link_libraries(tstpgn PRIVATE generated::sources CWChessboard::position AICxx::cwds)

add_executable(tstspirit tstspirit.cxx PgnGrammar.h)
target_include_directories(tstspirit PUBLIC "${top_objdir}")

诀窍是
添加库(生成的对象)
及以下,然后链接
生成的::源代码

谢谢,这很有效。但还有一个问题。此注释太小,无法添加具体内容,因此请允许我编辑问题以添加:/。与我下面的回答相关,您的代码似乎使用了
${CMAKE\u CURRENT\u SRC\u DIR}
,除非您自己定义了它,否则它不是由CMAKE填充的变量。您可能需要
${CMAKE\u CURRENT\u SOURCE\u DIR}
。关于您的新问题,它似乎与您的原始问题无关,但您可以尝试使用post中描述的习惯用法添加
add_custom_target
,以确保生成的源文件仅在需要时更新。这似乎对我不起作用:我需要将生成的源文件作为源添加到可执行文件中,这使得他们直接依赖他们。因此,在“中间”添加目标不起作用。因此,我无法使用您的解决方案,而是使用了不同的方法。我也会加上“答案”。关于CMAKE_CURRENT_SRC_DIR。。。非常感谢。我自己并没有定义它,但由于某种原因两者都起作用(也许这个打字错误是“支持的”:p)。尽管如此,我只是编辑了这个问题,并将其修正为文档中所说的正确内容。再次感谢。谢谢你的回复。在找到适合您的解决方案时,请记住将答案标记为已接受。没有经过投票或接受答案的问题将保持未解决状态。你是对的,这不好。我不接受我的是因为我觉得对你很粗鲁。虽然我觉得我也不能接受你的建议,因为我真的尝试了你的解决方案,但这对于我最终的具体案例来说是不够的。计划是等一会儿,然后在你把答案忘得一干二净的时候,把我的答案标记为接受。谢谢你的提醒,我已经忘得一干二净了。
...
#================================================================
# GENERATED SOURCE FILES
#

add_executable(table_gen table_gen.cxx)

add_custom_command(OUTPUT chattr.tab.cpp
  DEPENDS table_gen
  COMMAND ./table_gen > chattr.tab.cpp
)

add_custom_command(OUTPUT PgnGrammar.h
  DEPENDS generate_PgnGrammar.h.sh
  COMMAND ${CMAKE_CURRENT_LIST_DIR}/generate_PgnGrammar.h.sh
)

add_library(generated_ObjLib OBJECT)
target_sources(generated_ObjLib
  PRIVATE
    "chattr.tab.cpp"
    "PgnGrammar.h"
)

target_include_directories(generated_ObjLib
  PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}" # For local header files.
)

add_library(generated::sources ALIAS generated_ObjLib)

#==================================================================
# TEST EXECUTABLES
#

add_executable(tstchessposition tstchessposition.cxx)
target_link_libraries(tstchessposition PRIVATE CWChessboard::position AICxx::cwds)

add_executable(tstbenchmark tstbenchmark.cxx)
target_link_libraries(tstbenchmark PRIVATE CWChessboard::position AICxx::cwds)

add_executable(tstpgnread tstpgnread.cxx PgnDatabase.cxx MemoryBlockList.cxx)
target_link_libraries(tstpgnread PRIVATE generated::sources CWChessboard::position AICxx::cwds)

add_executable(tsticonv tsticonv.cxx)
target_link_libraries(tsticonv PRIVATE PkgConfig::glibmm)

add_executable(tstpgn tstpgn.cxx PgnDatabase.cxx MemoryBlockList.cxx)
target_link_libraries(tstpgn PRIVATE generated::sources CWChessboard::position AICxx::cwds)

add_executable(tstspirit tstspirit.cxx PgnGrammar.h)
target_include_directories(tstspirit PUBLIC "${top_objdir}")