C++ CMake:在CMake脚本执行期间生成源
我正在尝试将我的Visual Studio解决方案迁移到CMakeC++ CMake:在CMake脚本执行期间生成源,c++,cmake,C++,Cmake,我正在尝试将我的Visual Studio解决方案迁移到CMake 我有两个项目——生成器(Guangal.exe生成C++文件源)和MyPROJ(包括一些必须由Guang.exe处理的文本文件)。 我想要的是: 建造发电机项目 从STEP1使用Guang.Exe从ProjyMyProj/中的文本文件生成C++源文件 将这些生成的源文件放入myProj的最终VS项目中 那么,如何做到这一点呢 编辑 到目前为止,我所尝试的: ####################################
我有两个项目——生成器(Guangal.exe生成C++文件源)和MyPROJ(包括一些必须由Guang.exe处理的文本文件)。 我想要的是:
###################################################################
# in root/generator/CMakeLists.txt:
set(SRC_LIST .... )
set(HDR_LIST .... )
add_executable(generator ${SRC_LIST} ${HDR_LIST})
###################################################################
# in root/my_proj/CMakeLists.txt:
add_subdirectory(../generator/ ../generator/cmake_out)
add_subdirectory(src)
###################################################################
# in root/my_proj/src/CMakeLists.txt:
ADD_CUSTOM_COMMAND(
OUTPUT ../include/SomeSource.h SomeSource.cpp
COMMAND generator ../definitions/SomeDefs1.txt
DEPENDS generator ../definitions/SomeDefs1.txt
)
set(SRC_LIST SomeSource.cpp .... )
set(HDR_LIST SomeSource.h .... )
add_library(myProj STATIC ${SRC_LIST} ${HDR_LIST} )
###################################################################
###################################################################
CMake的输出:
.....
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler using: Visual Studio 12 2013
-- Check for working CXX compiler using: Visual Studio 12 2013 -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
CMake Error at src/CMakeLists.txt:145 (add_library):
Cannot find source file:
../include/SomeSource.h
Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
.hxx .in .txx
从CMake开始,从那里开始:
add_executable( generator ${generator_SOURCES} )
add_custom_command( OUTPUT source1.cpp source2.cpp
COMMAND generator args1 args2
COMMENT "Generating sources..." )
是否将myProj集成到其他项目中,或将其保持在外部取决于您的个人需要,并影响最终设置的外观
回复您的编辑: 首先,将头文件包含在源列表中是一个非常糟糕的主意。CMake与编译器合作,应该能够找出源文件对它们包含的头文件的依赖关系,而且它们比大多数人做得更好。C++的
#include
已经告诉编译器处理标题
其次,您正在显示的CMake代码不是您正在执行的代码。您的add_library()
列出了SomeSource.h
,但CMake抱怨。/include/SomeSource.h
。目录名也不起作用。这使得很难说到底是什么错了
在熟悉新工具时,我的一般建议是:不要立即尝试让它在您最终希望它工作的环境中运行(在本例中是myProj)。相反,设置一个简单的测试环境(使用目录X和Y、源文件foo.cpp和bar.cpp,您就知道了),并测试这些概念(比如,让echo
创建一个文件而不是generator
,这样您就不需要先构建generator
,这是下一步)
这样,如果出现任何问题,您可以在摘要中寻求帮助,并且您可以提供完整的示例代码供其他人解决,而无需在项目设置中摇摆不定
此外,你还可以避免错误的先入之见带来的问题。很多时候,你的第一次尝试会导致一个尴尬的设置,真正的优雅只有从经验教训中产生。投入时间正确学习该工具
如果您还不知道,允许CMake创建一个MSVC项目文件,将给定的源文件分组在一起,这样您就可以在CMake控制下创建项目,但仍然可以在MSVC中轻松工作
我已经建立了一个“框架”CMake设置,我在各种项目中使用它,也许你对此感兴趣(出于灵感或实际使用):@VramVardanian:更新了答案。我总是将我的头文件(并非所有包含的头文件)列为CMake源,以便它们显示在生成的项目中。@John:你将它们列在相应的
source\u组()
命令,但不在添加库()
中。这只是自找麻烦。首先,在源代码列表中包含头文件是一个非常糟糕的主意。
-1,使用源代码组
或notcommand添加可执行文件(foo-foo.cpp-foo.hpp)都是完全正常的
不会产生gcc-o foo foo.cpp foo.hpp
如果你不相信我,你可以自己检查。