CMake:设置目标源的目录

时间:2019-04-03 11:16:04

标签: c++ cmake

我有一个C ++项目,其中所有实现源文件(* .cpp)都位于项目目录内的 src 目录中。一些文件在其他子目录中。假设 src / foo / 中有50个文件。我需要将这些文件作为add_library和/或target_sources函数的一部分列出。

现在,不鼓励人们四处寻找,自动添加目录中的所有文件,这对我来说很好。因此,我将手动列出所有文件;但是重复通用前缀 src / foo / 50次似乎很愚蠢,而且很烦人。

the documentation for target_sources中说

  

相对源文件路径被解释为相对于当前源目录(即CMAKE_CURRENT_SOURCE_DIR)。

因此,我在调用set(CMAKE_CURRENT_SOURCE_DIR "src/foo/")之前添加了target_source,但是没有用。 (我收到“找不到源文件”错误。)

那么,即使有可能,实现我想要的正确方法是什么?

N.B .:项目的(公共)头文件(* .hpp)位于 include 目录(在 src 之外)。使用target_include_directories函数可以很好地配置它(不必列出单个文件)。

4 个答案:

答案 0 :(得分:2)

  

但重复通用前缀src / foo / 50次

只需在源代码前面加上前缀。

def plot_convnet(convnet, input_num=0):
    # since convnet1 is 4dim (?,52,52,32) Assuming the first dim is Batch size you 
    # can plot the 32 channels of a single image from the batch given by input_num

    C = Session.run(convnet) # remove the session run if the tensor is already 
                             #evaluated

    # Number of channels -- 32 in your case 
    num_chnls = C.shape[3]

    # Number of grids to plot.
    # Rounded-up, square-root of the number of channels
    grids = math.ceil(math.sqrt(num_chnls))

    #Create figure with a grid of sub-plots.
    fig, axes = plt.subplots(grids, grids)

    for i, ax in enumerate(axes.flat):
       if i<num_chnls:
           im = C[input_num,:, :,  i]
           #Plot image.
           ax.imshow(im,                  
                     interpolation='nearest', cmap='seismic')
    plt.show()

答案 1 :(得分:0)

SELECT DISTINCT CAST(cust_mart.acct_identifier AS STRING) as f0 FROM cts_work.cust_xref cust_mart; 设置为与旧CMAKE_CURRENT_SOURCE_DIR的相对变量将不起作用。如果将其设置为一个值,那么可以合理地假设删除该值并使用自定义值是错误的,因为您缺少之前设置的值。

您可能希望将其设置为绝对路径,或使用CMAKE_CURRENT_SOURCE_DIR,或作为许多其他人,并始终复制并粘贴前缀。这是标准做法(也是我仍然很懒的原因,这也是我仍然使用GLOB的原因之一),跟进显式要比隐式(这是不使用set(CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/foo/")的要点)要好。

答案 2 :(得分:0)

您还可以在add_subdirectory(src/foo)中使用CMakeLists.txtsrc/foo,只需将其放入

target_sources( <your target> PRIVATE|PUBLIC|INTERFACE
  your
  list
  of
  sources
)

我认为那会很优雅。

答案 3 :(得分:0)

我会建议(如果你有 bash 或一些类似的 shell)

function prepend() { while read line; do echo "${1}${line}"; done; }
ls *.cc *hh | sort | prepend  "\${CMAKE_CURRENT_SOURCE_DIR}/"

然后复制粘贴:)