114

我正在尝试使用 Visual Studio 2010 和 Cygwin 在 Windows 7 x64 上运行 cmake hello world 程序,但似乎都无法正常工作。我的目录结构如下:

HelloWorld
-- CMakeLists.txt
-- src/
-- -- CMakeLists.txt
-- -- main.cpp
-- build/

我做了 acd build后跟 a cmake ..,并得到一个错误说明

CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".

但是,如果我在我的文件系统上将 main.cpp 的扩展名更改为 main.c,并且src/CMakeLists.txt一切都按预期工作。这是从 Visual Studio 命令提示符(Visual Studio 解决方案生成器)和 Cygwin 终端(Unix Makefiles 生成器)运行的情况。

知道为什么这段代码不起作用吗?

CMakeLists.txt

PROJECT(HelloWorld C)
cmake_minimum_required(VERSION 2.8)

# include the cmake modules directory
set(CMAKE_MODULE_PATH ${HelloWorld_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})

add_subdirectory(src)

src/CMakeLists.txt

# Include the directory itself as a path to include directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Create a variable called helloworld_SOURCES containing all .cpp files:
set(HelloWorld_SOURCES main.cpp)

# Create an executable file called helloworld from sources:
add_executable(hello ${HelloWorld_SOURCES })

src/main.cpp

int main()
{
  return 0;
}
4

10 回答 10

227

我也得到了你提到的错误:

CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".

在我的情况下,这是由于具有.cc扩展名的 C++ 文件。

如果 CMake 无法正确确定代码的语言,您可以使用以下内容:

set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)

建议将语言附加到project()语句中的公认答案只是增加了对所使用语言的更严格检查(根据文档),但这对我没有帮助:

您可以选择指定项目支持的语言。示例语言有 CXX(即 C++)、C、Fortran 等。默认情况下启用 C 和 CXX。例如,如果您没有 C++ 编译器,您可以通过明确列出您想要支持的语言(例如 C)来禁用对它的检查。通过使用特殊语言“NONE”,可以禁用对任何语言的所有检查。如果存在名为 CMAKE_PROJECT__INCLUDE_FILE 的变量,则该变量指向的文件将作为项目命令的最后一步包含在内。

于 2013-05-21T11:40:51.620 回答
89

就我而言,这只是因为目标中没有源文件。我所有的代码都是一个模板,头文件中有源代码。添加一个空的 file.cpp 解决了这个问题。

于 2015-04-08T14:52:59.400 回答
50

尝试改变

PROJECT(HelloWorld C)

进入

PROJECT(HelloWorld C CXX)

要不就

PROJECT(HelloWorld)

见:http ://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:project

于 2012-08-03T19:19:57.893 回答
18

令人困惑的是,当项目中包含的 cpp 文件不存在时也会发生错误。

如果您在 CMakeLists.txt 中列出源文件并错误地键入文件名,则会收到此错误。

于 2018-04-04T06:14:08.933 回答
8

对 OP 的回答有点不相关,但对于像我这样有类似问题的人来说。

用例:Ubuntu(C、Clion、自动完成):

我有同样的错误,

CMake 错误:无法确定目标“hello”的链接语言。

set_target_properties(hello PROPERTIES LINKER_LANGUAGE C)帮助解决该问题,但标题不包含在项目中,并且自动完成将不起作用。

这就是我所拥有的

cmake_minimum_required(VERSION 3.5)

project(hello)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES ./)

add_executable(hello ${SOURCE_FILES})

set_target_properties(hello PROPERTIES LINKER_LANGUAGE C)

没有错误,但不是我需要的,我意识到将单个文件作为源代码将使我自动完成,并将链接器设置为C.

cmake_minimum_required(VERSION 3.5)

project(hello)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES ./1_helloworld.c)

add_executable(hello ${SOURCE_FILES})
于 2019-08-01T14:59:41.720 回答
8

如果要构建没有任何源文件的库,我想添加另一个解决方案。此类库也称为仅标头库。默认情况下add_library,至少需要添加一个源文件,否则会发生上述错误。由于只有标头的库很常见,因此 cmake 具有INTERFACE构建此类库的关键字。该INTERFACE关键字的使用如下所示,它消除了将空源文件添加到库中的需要。

add_library(myLibrary INTERFACE)
target_include_directories(myLibrary INTERFACE {CMAKE_CURRENT_SOURCE_DIR})

上面的示例将构建一个仅包含头文件的库,包括与 CMakeLists.txt 位于同一目录中的所有头文件。{CMAKE_CURRENT_SOURCE_DIR}如果您的头文件与 CMakeLists.txt 文件位于不同的目录中,请替换为路径。

查看此博客文章cmake 文档以获取有关仅标头库和 cmake 的更多信息。

于 2020-10-18T16:48:10.910 回答
2

在编译基于 C 的代码时,我也遇到了类似的错误。我通过更正文件中的源文件路径解决了这个问题cmake。请检查您的文件中提到的每个源文件的源文件路径cmake。这也可能对您有所帮助。

于 2018-06-20T09:46:46.517 回答
0

默认情况下,JNI Native 文件夹命名为jni。将其重命名为cpp解决了该问题

于 2018-04-25T10:29:54.163 回答
0

只需检查源文件的路径。(到各自的 cpp)

于 2021-10-14T04:26:38.723 回答
-3

我设法解决了我的问题,通过改变

add_executable(file1.cpp)

add_executable(ProjectName file1.cpp)
于 2018-10-25T12:22:36.920 回答