CMake提供了几种指定目标源文件的方法.一种是使用globbing(文档),例如:
FILE(GLOB MY_SRCS dir/*)
Run Code Online (Sandbox Code Playgroud)
另一个是单独指定每个文件.
哪种方式更喜欢?Globbing似乎很容易,但我听说它有一些缺点.
我做了很多项目和很多不同的构建系统和CI工具.最近,我接触到了一个偶然的挑战性任务,即为一个合理大小的C++应用程序添加基于autotools的环境.虽然我喜欢最终用户的易用性,但我并不喜欢处理m4和开发人员方面的所有auto*工具.
我在业余时间做了一个相当大的辅助项目,并且决定我想把CMake用于试驾.由于我刚刚开始,我显然正在计划挖掘文档,常见问题解答,维基等,并边做边学.顺便说一下,我为"Mastering CMake"这本书付钱,但我在亚马逊上发现的评论足以让我觉得它可能不值钱.所有这一切,在任何新的东西中都经常会出现"陷阱",新人经常会偶然发现旧的专业人士早已学会避免.我想知道那些基于人们对CMake的经验是什么,我希望通过在这里询问来减少我的学习痛苦.
我应该指出,我计划主要在Linux上构建,以及其他UN*X变体.Windows并不是我的POV真正关心的问题.这是一个大型服务器端应用程序,具有用于操作员的Web和CLI界面,用于自动化/与OSS工具集成的北向REST接口,以及用于CPE的SOAP南向接口.我将需要很多第三方库和应用程序来实现这一切,除非我想在未来10年内手动构建这一切.:)
我的问题是这样的:我正在使用Visual Studio 2010开发一个小解析器.我使用CMake作为构建配置工具.
但我发现默认的可执行构建行为,不方便.我想要的是,让我的最终计划位于:
E:/parsec/bin/<exe-name>.<build-type>.exe
Run Code Online (Sandbox Code Playgroud)
而不是
E:/parsec/bin/<build-type>/<exe-name>.exe
Run Code Online (Sandbox Code Playgroud)
你会怎么用CMake做到这一点?
我有一个使用CMake和Boost.Test的工作项目,其目录结构如下(请原谅ASCII艺术):
+-proj
|---CMakeLists.txt
|---build
|---test
|\----dir1
| \----foo.cpp // contains one BOOST_AUTO_TEST_SUITE and several BOOST_AUTO_TEST_CASE
| |---bar.cpp // contains one BOOST_AUTO_TEST_SUITE and several BOOST_AUTO_TEST_CASE
\----dir2
\----foo.cpp // contains one BOOST_AUTO_TEST_SUITE and several BOOST_AUTO_TEST_CASE
|---bar.cpp // contains one BOOST_AUTO_TEST_SUITE and several BOOST_AUTO_TEST_CASE
Run Code Online (Sandbox Code Playgroud)
我目前将所有源文件编译成一个可以与CTest一起运行的大型可执行文件.我的CMakeLists.txt看起来像这样:
file(GLOB_RECURSE test_cases FOLLOW_SYMLINKS "test/*.[h,c]pp")
add_executable(test_suite ${test_cases})
include_directories(${PROJECT_SOURCE_DIR} ${Boost_INCLUDE_DIRS})
target_link_libraries(test_suite ${Boost_LIBRARIES})
include(CTest)
add_test(test_runner test_suite)
Run Code Online (Sandbox Code Playgroud)
我想将每个.cpp文件编译成一个单独的可执行文件,并将其作为测试单独添加,以便我可以使用CTest正则表达式机制(特别是Boost.Test似乎没有的测试排除)来选择性地运行某些测试.但是,当CMake从dir1/dir2生成foo/bar的构建目标时,我得到名称冲突.
我的问题是:如何将整个目录树镜像test到一个类似的树下,build以便各种可执行文件之间不再存在名称冲突,以便CTest可以全部运行它们?
注意:不能在源树中重命名它们.我想foreach()对变量做一个${test_cases}(如本答案中所解释的),但我无法提取相关目录和文件名,并build/逐个文件地将它们移植到目录中.
更新:最后,我拼凑了这个脚本:
# get the test sources
file(GLOB_RECURSE …Run Code Online (Sandbox Code Playgroud) 我有以下问题:我使用以下类来初始化C库:
class Hello
{
public:
Hello()
{
cout << "Hello world" << endl;
}
~Hello()
{
cout << "Goodbye cruel world" << endl;
}
} hello_inst;
Run Code Online (Sandbox Code Playgroud)
如果我将此代码包含在hello.cc文件中并将其与包含main()的另一个文件一起编译,则会在调用main()之前创建hello_inst并将其销毁.在这种情况下,它只打印一些行,在我的项目中,我通过LIBXML_TEST_VERSION初始化libxml.
我正在创建多个可执行文件,它们在cmake项目中共享许多相同的代码.根据这个线程:在CMake中添加多个可执行文件我创建了一个包含上面显示的代码的静态库,然后将可执行文件链接到该库.不幸的是,在这种情况下,永远不会创建hello_inst(并且永远不会初始化libxml2).我该如何解决这个问题?