CMakeLists.txt中连接字符串

今天研究protobuf时,发现protobuf生成的是.cc后缀的代码文件,在此之前,我自己写的代码都是.cpp后缀的,在CMakeLists.txt中这样做就可以将指定目录的所有.cpp文件都加入某一个变量,在ADD_EXECUTABLE/ADD_LIBRARY时使用

FILE(GLOB_RECURSE CPP_SRC_LIST "src/*.cpp") # 将src目录下所有.cpp加入CPP_SRC_LIST变量中(以分号作为分隔)

但是,如果代码文件不只有.cpp,这样做就行不通了。我想到用连接变量的方法来解决,一个变量用来保存所有cpp,一个变量用来保存cc,最后将两个变量连接起来,就是所有文件的路径了

但是这个连接方法我用百度搜了半天,毛结果都没有,后来忽然发现“信百度,不靠谱”,果断google,第二个结果中就说到了我想要的(赞一下Google):在CMakeLists.txt中,可以用SET来连接两个字符串变量

刚才的问题即可如下解决:


FILE(GLOB_RECURSE CPP_SRC_LIST "src/*.cpp") # 将src目录下所有.cpp加入CPP_SRC_LIST变量中(以分号作为分隔)
FILE(GLOB_RECURSE CC_SRC_LIST "src/*.cc") # 将src目录下所有.cpp加入CC_SRC_LIST变量中(以分号作为分隔)
SET(ALL_SRC_LIST ${CPP_SRC_LIST} ${CC_SRC_LIST}) # 将CPP_SRC_LIST和CC_SRC_LIST相连,赋值给ALL_SRC_LIST


这样一来,ALL_SRC_LIST的内容就是所有代码文件的路径了。


btw:

做了个小实验,连接字符串时有两种写法,会产生不同的结果,假设CPP_SRC_LIST的内容为main.cpp,CC_SRC_LIST的内容为other.cc,则几种办法连接后的结果是:

1.SET(ALL_SRC_LIST ${CPP_SRC_LIST} ${CC_SRC_LIST})

结果:main.cpp;other.cc

描述:上述写法将字符串连接后,中间加了分号,如果是用于生成二进制文件(可执行程序/静态动态库)就需要用这种办法连接,


2.SET(ALL_SRC_LIST "${CPP_SRC_LIST} ${CC_SRC_LIST}")

结果:main.cpp other.cc

描述:上述方法将字符串连接后,中间有一个空格,这是因为两个变量书写时就有一个空格在中间,换句话说,如果上述方法改写为:

SET(ALL_SRC_LIST "${CPP_SRC_LIST}====${CC_SRC_LIST}") # 加了四个=号

则结果会是:main.cpp====other.cc

你可能感兴趣的:(CMakeLists.txt中连接字符串)