我们主要使用 C
编写应用程序,但是一些子模块是用 C++
编写的(在 Linux 上)。问题是如何编写 CMakeLists.txt
文件以便于在某些子目录中使用 g++
,在另外一些子目录中使用 gcc
。
如果没有特别指定,编译器和链接器通常由文件扩展名决定。因此只要文件后缀正确,你的代码就会使用正确的编译器进行编译和链接。
顺便提一下,如果你混合使用C和C++,请记得进行正确的extern C声明。
CMake会自动完成这个过程。你可以在CMakeLists.txt文件中自由混合使用这两种类型的文件:
. . .
add_executable(
my_program
code.cpp
more_code.c
)
我经常这样做,而且它总是有效的。
extern "C" { #include "more_code.h" }
语句。 - UnapiedraCMake应该利用文件扩展名指定的相关编译器和链接器。如果您使用C和C ++的组合来编译和链接可执行文件,则可以这样说:
add_executable(MyEXE main.cpp myFile.c)
我想要补充一个非常琐碎的观点。
在这种情况下,您必须确保您的项目有正确的语言名称参数,即 1:
project(MyProject C CXX)
添加CMake文件时应自动完成此操作,但根据添加文件的顺序,参数可能仅包括C或CXX。
例如,如果您只将C作为语言参数,并且您的int main()
在main.cpp中,那么程序入口点不存在,编译器将忽略错误。
1 或者您可以省略语言参数,此时将选择默认参数C和CXX。请参见此处。
明确一下,可以编译C ++代码。在这方面,和是相同的。唯一的区别是使用时您不必显式告诉编译器链接到libstdc ++。
CMakeLists.txt
的顶部,使用project(myproject)
,而不是使用例如project(myproject C)
。 - congusbongusproject(myproject LANGUAGES C CXX)
。当您没有指定任何语言时,启用C和CXX是默认的CMake行为。https://cmake.org/cmake/help/latest/command/project.html - user7610