CMake无法使用C ++确定链接器语言


89

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

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

我先执行,cd build然后执行cmake ..,并收到一条错误消息,指出

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

但是,如果我将filsystem和src/CMakeLists.txt所有正常工作的main.cpp扩展名更改为main.c。从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;
}

“ [...]如果我更改main.cpp [...]的扩展名,您将其更改为什么?.cc?
JAB 2012年

哎呀 偶然遗漏了。我将其更改为“ .c”。在原始帖子中编辑。几乎让我认为没有cpp编译器或类似的东西,但是g ++被安装了,Visual Studio也不会出现c ++问题。
克里斯·克雷伯

Answers:



182

我也收到您提到的错误:

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的变量,则该变量指向的文件将作为项目命令的最后一步包括在内。


就我而言,我的文件扩展名为.hpp。这样解决了!
brawner

对我来说,.hpp文件也是如此,这已将其修复。
KulaGGin

68

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


6
设置目标属性也适用于无cpp文件问题。
丹妮丝·斯基德莫尔

1
小费的荣誉。我也确实忘记将源移动到src新创建的cmake项目(共享库)的相应子目录中,这基本上是整个问题的原因。在这种情况下,确实非常感谢拥有一个向导来照顾您的cmake项目结构。:D
rbaleksandar '16

同样的原因(复制粘贴错误)。谢谢!
Vivit

2
有用的提示。即使您的“库”仅是标题,您也应该创建一个.cpp文件,#include为每个文件做一个。即使在编译库时没有输出,它也会对文件进行语法检查,并检查您可能错过的标头依赖项(例如系统标头)。
Mark Lakata

它是如此简单。路径中的错字导致源中没有* .cpp文件。在那之后一切都很好。谢谢!
拉胡尔达斯

17

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

如果您在CMakeLists.txt中列出您的源文件,并且错误地输入了文件名,则会出现此错误。


请按照评论部分中的说明进行操作。
Virb

1
这与其他答案无关,因此可以作为其自己的答案。这也解决了我的问题。
Czarking

5

与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})

刚刚注意到您正在使用CXX_FLAGS设置C ++标准版本,并以为我提到了CXX_STANDARD变量,我认为这是推荐的方法 cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html,应该是在cmake的3.5可用
克里斯隐蔽

2

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



0

如果要构建没有任何源文件的库,我想添加另一种解决方案。这样的库也称为仅标头库。默认情况下,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的更多信息。


-2

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

add_executable(file1.cpp)

add_executable(ProjectName file1.cpp)

-2

就我而言,在头文件中实现类的成员函数会导致此错误。分离接口(在xh文件中)和实现(在x.cpp文件中)可以解决此问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.