我有一个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
函数可以很好地配置它(不必列出单个文件)。
答案 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.txt
和src/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}/"
然后复制粘贴:)